Warning, /include/clang/Basic/arm_mve_builtin_cg.inc is written in an unsupported language. File is not indexed.
0001 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_s64:
0002 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_u64:
0003 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_f32:
0004 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_s32:
0005 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_u32: {
0006 llvm::Type * Param0;
0007 llvm::Type * Param1;
0008 switch (BuiltinID) {
0009 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_s64:
0010 Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
0011 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0012 break;
0013 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_u64:
0014 Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
0015 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0016 break;
0017 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_f32:
0018 Param0 = llvm::FixedVectorType::get(FloatTy, 4);
0019 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0020 break;
0021 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_s32:
0022 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
0023 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0024 break;
0025 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_u32:
0026 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
0027 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0028 break;
0029 }
0030 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0031 Value *Val1 = Builder.CreateLoad(Val0);
0032 Value *Val2 = EmitScalarExpr(E->getArg(1));
0033 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base_wb, {Param0, Param1}), {Val1, Val2});
0034 Value *Val4 = Builder.CreateExtractValue(Val3, static_cast<unsigned>(1));
0035 Builder.CreateStore(Val4, Val0);
0036 return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
0037 }
0038 case ARM::BI__builtin_arm_mve_vddupq_wb_u16:
0039 case ARM::BI__builtin_arm_mve_vddupq_wb_u32:
0040 case ARM::BI__builtin_arm_mve_vddupq_wb_u8:
0041 case ARM::BI__builtin_arm_mve_vidupq_wb_u16:
0042 case ARM::BI__builtin_arm_mve_vidupq_wb_u32:
0043 case ARM::BI__builtin_arm_mve_vidupq_wb_u8: {
0044 Intrinsic::ID Param0;
0045 llvm::Type * Param1;
0046 switch (BuiltinID) {
0047 case ARM::BI__builtin_arm_mve_vddupq_wb_u16:
0048 Param0 = Intrinsic::arm_mve_vddup;
0049 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
0050 break;
0051 case ARM::BI__builtin_arm_mve_vddupq_wb_u32:
0052 Param0 = Intrinsic::arm_mve_vddup;
0053 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0054 break;
0055 case ARM::BI__builtin_arm_mve_vddupq_wb_u8:
0056 Param0 = Intrinsic::arm_mve_vddup;
0057 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
0058 break;
0059 case ARM::BI__builtin_arm_mve_vidupq_wb_u16:
0060 Param0 = Intrinsic::arm_mve_vidup;
0061 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
0062 break;
0063 case ARM::BI__builtin_arm_mve_vidupq_wb_u32:
0064 Param0 = Intrinsic::arm_mve_vidup;
0065 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0066 break;
0067 case ARM::BI__builtin_arm_mve_vidupq_wb_u8:
0068 Param0 = Intrinsic::arm_mve_vidup;
0069 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
0070 break;
0071 }
0072 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0073 Value *Val1 = Builder.CreateLoad(Val0);
0074 Value *Val2 = EmitScalarExpr(E->getArg(1));
0075 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val1, Val2});
0076 Value *Val4 = Builder.CreateExtractValue(Val3, static_cast<unsigned>(1));
0077 Builder.CreateStore(Val4, Val0);
0078 return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
0079 }
0080 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_s64:
0081 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_u64:
0082 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_f32:
0083 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_s32:
0084 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_u32: {
0085 llvm::Type * Param0;
0086 llvm::Type * Param1;
0087 switch (BuiltinID) {
0088 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_s64:
0089 Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
0090 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0091 break;
0092 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_u64:
0093 Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
0094 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0095 break;
0096 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_f32:
0097 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
0098 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
0099 break;
0100 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_s32:
0101 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
0102 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0103 break;
0104 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_u32:
0105 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
0106 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0107 break;
0108 }
0109 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0110 Value *Val1 = Builder.CreateLoad(Val0);
0111 Value *Val2 = EmitScalarExpr(E->getArg(1));
0112 Value *Val3 = EmitScalarExpr(E->getArg(2));
0113 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base_wb, {Param0, Param1}), {Val1, Val2, Val3});
0114 return Builder.CreateStore(Val4, Val0);
0115 }
0116 case ARM::BI__builtin_arm_mve_vdwdupq_wb_u16:
0117 case ARM::BI__builtin_arm_mve_vdwdupq_wb_u32:
0118 case ARM::BI__builtin_arm_mve_vdwdupq_wb_u8:
0119 case ARM::BI__builtin_arm_mve_viwdupq_wb_u16:
0120 case ARM::BI__builtin_arm_mve_viwdupq_wb_u32:
0121 case ARM::BI__builtin_arm_mve_viwdupq_wb_u8: {
0122 Intrinsic::ID Param0;
0123 llvm::Type * Param1;
0124 switch (BuiltinID) {
0125 case ARM::BI__builtin_arm_mve_vdwdupq_wb_u16:
0126 Param0 = Intrinsic::arm_mve_vdwdup;
0127 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
0128 break;
0129 case ARM::BI__builtin_arm_mve_vdwdupq_wb_u32:
0130 Param0 = Intrinsic::arm_mve_vdwdup;
0131 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0132 break;
0133 case ARM::BI__builtin_arm_mve_vdwdupq_wb_u8:
0134 Param0 = Intrinsic::arm_mve_vdwdup;
0135 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
0136 break;
0137 case ARM::BI__builtin_arm_mve_viwdupq_wb_u16:
0138 Param0 = Intrinsic::arm_mve_viwdup;
0139 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
0140 break;
0141 case ARM::BI__builtin_arm_mve_viwdupq_wb_u32:
0142 Param0 = Intrinsic::arm_mve_viwdup;
0143 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0144 break;
0145 case ARM::BI__builtin_arm_mve_viwdupq_wb_u8:
0146 Param0 = Intrinsic::arm_mve_viwdup;
0147 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
0148 break;
0149 }
0150 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0151 Value *Val1 = Builder.CreateLoad(Val0);
0152 Value *Val2 = EmitScalarExpr(E->getArg(1));
0153 Value *Val3 = EmitScalarExpr(E->getArg(2));
0154 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val1, Val2, Val3});
0155 Value *Val5 = Builder.CreateExtractValue(Val4, static_cast<unsigned>(1));
0156 Builder.CreateStore(Val5, Val0);
0157 return Builder.CreateExtractValue(Val4, static_cast<unsigned>(0));
0158 }
0159 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_s64:
0160 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_u64:
0161 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_f32:
0162 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_s32:
0163 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_u32: {
0164 llvm::Type * Param0;
0165 llvm::Type * Param1;
0166 llvm::Type * Param2;
0167 switch (BuiltinID) {
0168 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_s64:
0169 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0170 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0171 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
0172 break;
0173 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_wb_z_u64:
0174 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0175 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0176 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
0177 break;
0178 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_f32:
0179 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0180 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
0181 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
0182 break;
0183 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_s32:
0184 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0185 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0186 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
0187 break;
0188 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_wb_z_u32:
0189 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0190 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0191 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
0192 break;
0193 }
0194 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0195 Value *Val1 = Builder.CreateLoad(Val0);
0196 Value *Val2 = EmitScalarExpr(E->getArg(1));
0197 Value *Val3 = EmitScalarExpr(E->getArg(2));
0198 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0199 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
0200 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base_wb_predicated, {Param1, Param2, Param0}), {Val1, Val2, Val5});
0201 Value *Val7 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(1));
0202 Builder.CreateStore(Val7, Val0);
0203 return Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
0204 }
0205 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_s64:
0206 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_u64:
0207 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_f32:
0208 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_s32:
0209 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_u32: {
0210 llvm::Type * Param0;
0211 llvm::Type * Param1;
0212 llvm::Type * Param2;
0213 switch (BuiltinID) {
0214 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_s64:
0215 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0216 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0217 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
0218 break;
0219 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_wb_p_u64:
0220 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0221 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
0222 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
0223 break;
0224 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_f32:
0225 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0226 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0227 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
0228 break;
0229 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_s32:
0230 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0231 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0232 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
0233 break;
0234 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_wb_p_u32:
0235 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0236 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
0237 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
0238 break;
0239 }
0240 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0241 Value *Val1 = Builder.CreateLoad(Val0);
0242 Value *Val2 = EmitScalarExpr(E->getArg(1));
0243 Value *Val3 = EmitScalarExpr(E->getArg(2));
0244 Value *Val4 = EmitScalarExpr(E->getArg(3));
0245 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
0246 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
0247 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base_wb_predicated, {Param1, Param2, Param0}), {Val1, Val2, Val3, Val6});
0248 return Builder.CreateStore(Val7, Val0);
0249 }
0250 case ARM::BI__builtin_arm_mve_vld1q_f32:
0251 case ARM::BI__builtin_arm_mve_vldrwq_f32: {
0252 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0253 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4)));
0254 Address Val2 = Address(Val1, llvm::FixedVectorType::get(FloatTy, 4), CharUnits::fromQuantity(4));
0255 return Builder.CreateLoad(Val2);
0256 }
0257 case ARM::BI__builtin_arm_mve_vld1q_z_f32:
0258 case ARM::BI__builtin_arm_mve_vldrwq_z_f32: {
0259 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0260 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4)));
0261 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 4);
0262 Value *Val3 = EmitScalarExpr(E->getArg(1));
0263 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0264 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
0265 llvm::Type *Val6 = llvm::FixedVectorType::get(FloatTy, 4);
0266 Value *Val7 = llvm::Constant::getNullValue(Val6);
0267 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(FloatTy, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4))}), {Val1, Val2, Val5, Val7});
0268 }
0269 case ARM::BI__builtin_arm_mve_vld1q_f16:
0270 case ARM::BI__builtin_arm_mve_vldrhq_f16: {
0271 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0272 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8)));
0273 Address Val2 = Address(Val1, llvm::FixedVectorType::get(HalfTy, 8), CharUnits::fromQuantity(2));
0274 return Builder.CreateLoad(Val2);
0275 }
0276 case ARM::BI__builtin_arm_mve_vld1q_z_f16:
0277 case ARM::BI__builtin_arm_mve_vldrhq_z_f16: {
0278 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0279 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8)));
0280 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 2);
0281 Value *Val3 = EmitScalarExpr(E->getArg(1));
0282 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0283 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
0284 llvm::Type *Val6 = llvm::FixedVectorType::get(HalfTy, 8);
0285 Value *Val7 = llvm::Constant::getNullValue(Val6);
0286 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(HalfTy, 8), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8))}), {Val1, Val2, Val5, Val7});
0287 }
0288 case ARM::BI__builtin_arm_mve_vldrhq_s32:
0289 case ARM::BI__builtin_arm_mve_vldrhq_u32: {
0290 bool Param0;
0291 switch (BuiltinID) {
0292 case ARM::BI__builtin_arm_mve_vldrhq_s32:
0293 Param0 = 0;
0294 break;
0295 case ARM::BI__builtin_arm_mve_vldrhq_u32:
0296 Param0 = 1;
0297 break;
0298 }
0299 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0300 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
0301 Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int16Ty, 4), CharUnits::fromQuantity(2));
0302 Value *Val3 = Builder.CreateLoad(Val2);
0303 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
0304 return SignOrZeroExtend(Builder, Val3, Val4, static_cast<bool>(Param0));
0305 }
0306 case ARM::BI__builtin_arm_mve_vldrhq_z_s32:
0307 case ARM::BI__builtin_arm_mve_vldrhq_z_u32: {
0308 bool Param0;
0309 switch (BuiltinID) {
0310 case ARM::BI__builtin_arm_mve_vldrhq_z_s32:
0311 Param0 = 0;
0312 break;
0313 case ARM::BI__builtin_arm_mve_vldrhq_z_u32:
0314 Param0 = 1;
0315 break;
0316 }
0317 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0318 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
0319 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 2);
0320 Value *Val3 = EmitScalarExpr(E->getArg(1));
0321 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0322 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
0323 llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 4);
0324 Value *Val7 = llvm::Constant::getNullValue(Val6);
0325 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int16Ty, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4))}), {Val1, Val2, Val5, Val7});
0326 llvm::Type *Val9 = llvm::FixedVectorType::get(Int32Ty, 4);
0327 return SignOrZeroExtend(Builder, Val8, Val9, static_cast<bool>(Param0));
0328 }
0329 case ARM::BI__builtin_arm_mve_vld1q_s16:
0330 case ARM::BI__builtin_arm_mve_vld1q_u16:
0331 case ARM::BI__builtin_arm_mve_vldrhq_s16:
0332 case ARM::BI__builtin_arm_mve_vldrhq_u16: {
0333 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0334 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8)));
0335 Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int16Ty, 8), CharUnits::fromQuantity(2));
0336 return Builder.CreateLoad(Val2);
0337 }
0338 case ARM::BI__builtin_arm_mve_vld1q_z_s16:
0339 case ARM::BI__builtin_arm_mve_vld1q_z_u16:
0340 case ARM::BI__builtin_arm_mve_vldrhq_z_s16:
0341 case ARM::BI__builtin_arm_mve_vldrhq_z_u16: {
0342 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0343 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8)));
0344 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 2);
0345 Value *Val3 = EmitScalarExpr(E->getArg(1));
0346 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0347 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
0348 llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
0349 Value *Val7 = llvm::Constant::getNullValue(Val6);
0350 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8))}), {Val1, Val2, Val5, Val7});
0351 }
0352 case ARM::BI__builtin_arm_mve_vld1q_s32:
0353 case ARM::BI__builtin_arm_mve_vld1q_u32:
0354 case ARM::BI__builtin_arm_mve_vldrwq_s32:
0355 case ARM::BI__builtin_arm_mve_vldrwq_u32: {
0356 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0357 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4)));
0358 Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int32Ty, 4), CharUnits::fromQuantity(4));
0359 return Builder.CreateLoad(Val2);
0360 }
0361 case ARM::BI__builtin_arm_mve_vld1q_z_s32:
0362 case ARM::BI__builtin_arm_mve_vld1q_z_u32:
0363 case ARM::BI__builtin_arm_mve_vldrwq_z_s32:
0364 case ARM::BI__builtin_arm_mve_vldrwq_z_u32: {
0365 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0366 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4)));
0367 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 4);
0368 Value *Val3 = EmitScalarExpr(E->getArg(1));
0369 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0370 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
0371 llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
0372 Value *Val7 = llvm::Constant::getNullValue(Val6);
0373 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4))}), {Val1, Val2, Val5, Val7});
0374 }
0375 case ARM::BI__builtin_arm_mve_vld1q_s8:
0376 case ARM::BI__builtin_arm_mve_vld1q_u8:
0377 case ARM::BI__builtin_arm_mve_vldrbq_s8:
0378 case ARM::BI__builtin_arm_mve_vldrbq_u8: {
0379 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0380 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16)));
0381 Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int8Ty, 16), CharUnits::fromQuantity(1));
0382 return Builder.CreateLoad(Val2);
0383 }
0384 case ARM::BI__builtin_arm_mve_vld1q_z_s8:
0385 case ARM::BI__builtin_arm_mve_vld1q_z_u8:
0386 case ARM::BI__builtin_arm_mve_vldrbq_z_s8:
0387 case ARM::BI__builtin_arm_mve_vldrbq_z_u8: {
0388 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0389 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16)));
0390 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
0391 Value *Val3 = EmitScalarExpr(E->getArg(1));
0392 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0393 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val4});
0394 llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
0395 Value *Val7 = llvm::Constant::getNullValue(Val6);
0396 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16))}), {Val1, Val2, Val5, Val7});
0397 }
0398 case ARM::BI__builtin_arm_mve_vldrbq_s32:
0399 case ARM::BI__builtin_arm_mve_vldrbq_u32: {
0400 bool Param0;
0401 switch (BuiltinID) {
0402 case ARM::BI__builtin_arm_mve_vldrbq_s32:
0403 Param0 = 0;
0404 break;
0405 case ARM::BI__builtin_arm_mve_vldrbq_u32:
0406 Param0 = 1;
0407 break;
0408 }
0409 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0410 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
0411 Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int8Ty, 4), CharUnits::fromQuantity(1));
0412 Value *Val3 = Builder.CreateLoad(Val2);
0413 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
0414 return SignOrZeroExtend(Builder, Val3, Val4, static_cast<bool>(Param0));
0415 }
0416 case ARM::BI__builtin_arm_mve_vldrbq_z_s32:
0417 case ARM::BI__builtin_arm_mve_vldrbq_z_u32: {
0418 bool Param0;
0419 switch (BuiltinID) {
0420 case ARM::BI__builtin_arm_mve_vldrbq_z_s32:
0421 Param0 = 0;
0422 break;
0423 case ARM::BI__builtin_arm_mve_vldrbq_z_u32:
0424 Param0 = 1;
0425 break;
0426 }
0427 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0428 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
0429 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
0430 Value *Val3 = EmitScalarExpr(E->getArg(1));
0431 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0432 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
0433 llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 4);
0434 Value *Val7 = llvm::Constant::getNullValue(Val6);
0435 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int8Ty, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4))}), {Val1, Val2, Val5, Val7});
0436 llvm::Type *Val9 = llvm::FixedVectorType::get(Int32Ty, 4);
0437 return SignOrZeroExtend(Builder, Val8, Val9, static_cast<bool>(Param0));
0438 }
0439 case ARM::BI__builtin_arm_mve_vldrbq_s16:
0440 case ARM::BI__builtin_arm_mve_vldrbq_u16: {
0441 bool Param0;
0442 switch (BuiltinID) {
0443 case ARM::BI__builtin_arm_mve_vldrbq_s16:
0444 Param0 = 0;
0445 break;
0446 case ARM::BI__builtin_arm_mve_vldrbq_u16:
0447 Param0 = 1;
0448 break;
0449 }
0450 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0451 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
0452 Address Val2 = Address(Val1, llvm::FixedVectorType::get(Int8Ty, 8), CharUnits::fromQuantity(1));
0453 Value *Val3 = Builder.CreateLoad(Val2);
0454 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
0455 return SignOrZeroExtend(Builder, Val3, Val4, static_cast<bool>(Param0));
0456 }
0457 case ARM::BI__builtin_arm_mve_vldrbq_z_s16:
0458 case ARM::BI__builtin_arm_mve_vldrbq_z_u16: {
0459 bool Param0;
0460 switch (BuiltinID) {
0461 case ARM::BI__builtin_arm_mve_vldrbq_z_s16:
0462 Param0 = 0;
0463 break;
0464 case ARM::BI__builtin_arm_mve_vldrbq_z_u16:
0465 Param0 = 1;
0466 break;
0467 }
0468 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0469 Value *Val1 = Builder.CreatePointerCast((Val0.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
0470 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
0471 Value *Val3 = EmitScalarExpr(E->getArg(1));
0472 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
0473 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
0474 llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 8);
0475 Value *Val7 = llvm::Constant::getNullValue(Val6);
0476 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_load, {llvm::FixedVectorType::get(Int8Ty, 8), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8))}), {Val1, Val2, Val5, Val7});
0477 llvm::Type *Val9 = llvm::FixedVectorType::get(Int16Ty, 8);
0478 return SignOrZeroExtend(Builder, Val8, Val9, static_cast<bool>(Param0));
0479 }
0480 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s16:
0481 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s32:
0482 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s8:
0483 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u16:
0484 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u32:
0485 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u8:
0486 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_s64:
0487 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_u64:
0488 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_s64:
0489 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_u64:
0490 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_f16:
0491 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s16:
0492 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s32:
0493 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u16:
0494 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u32:
0495 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_f16:
0496 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s16:
0497 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s32:
0498 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u16:
0499 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u32:
0500 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_f32:
0501 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_s32:
0502 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_u32:
0503 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_f32:
0504 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_s32:
0505 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_u32: {
0506 uint32_t Param0;
0507 uint32_t Param1;
0508 llvm::Type * Param2;
0509 llvm::Type * Param3;
0510 llvm::Type * Param4;
0511 llvm::Type * Param5;
0512 switch (BuiltinID) {
0513 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s16:
0514 Param0 = 8;
0515 Param1 = 0;
0516 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0517 Param3 = llvm::PointerType::getUnqual(Int8Ty);
0518 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0519 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0520 break;
0521 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s32:
0522 Param0 = 8;
0523 Param1 = 0;
0524 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0525 Param3 = llvm::PointerType::getUnqual(Int8Ty);
0526 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0527 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0528 break;
0529 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_s8:
0530 Param0 = 8;
0531 Param1 = 0;
0532 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
0533 Param3 = llvm::PointerType::getUnqual(Int8Ty);
0534 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
0535 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
0536 break;
0537 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u16:
0538 Param0 = 8;
0539 Param1 = 0;
0540 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0541 Param3 = llvm::PointerType::getUnqual(Int8Ty);
0542 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0543 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0544 break;
0545 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u32:
0546 Param0 = 8;
0547 Param1 = 0;
0548 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0549 Param3 = llvm::PointerType::getUnqual(Int8Ty);
0550 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0551 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0552 break;
0553 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_p_u8:
0554 Param0 = 8;
0555 Param1 = 0;
0556 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
0557 Param3 = llvm::PointerType::getUnqual(Int8Ty);
0558 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
0559 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
0560 break;
0561 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_s64:
0562 Param0 = 64;
0563 Param1 = 0;
0564 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0565 Param3 = llvm::PointerType::getUnqual(Int64Ty);
0566 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0567 Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
0568 break;
0569 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_p_u64:
0570 Param0 = 64;
0571 Param1 = 0;
0572 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0573 Param3 = llvm::PointerType::getUnqual(Int64Ty);
0574 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0575 Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
0576 break;
0577 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_s64:
0578 Param0 = 64;
0579 Param1 = 3;
0580 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0581 Param3 = llvm::PointerType::getUnqual(Int64Ty);
0582 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0583 Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
0584 break;
0585 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_p_u64:
0586 Param0 = 64;
0587 Param1 = 3;
0588 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
0589 Param3 = llvm::PointerType::getUnqual(Int64Ty);
0590 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0591 Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
0592 break;
0593 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_f16:
0594 Param0 = 16;
0595 Param1 = 0;
0596 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0597 Param3 = llvm::PointerType::getUnqual(HalfTy);
0598 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0599 Param5 = llvm::FixedVectorType::get(HalfTy, 8);
0600 break;
0601 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s16:
0602 Param0 = 16;
0603 Param1 = 0;
0604 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0605 Param3 = llvm::PointerType::getUnqual(Int16Ty);
0606 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0607 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0608 break;
0609 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_s32:
0610 Param0 = 16;
0611 Param1 = 0;
0612 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0613 Param3 = llvm::PointerType::getUnqual(Int16Ty);
0614 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0615 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0616 break;
0617 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u16:
0618 Param0 = 16;
0619 Param1 = 0;
0620 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0621 Param3 = llvm::PointerType::getUnqual(Int16Ty);
0622 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0623 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0624 break;
0625 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_p_u32:
0626 Param0 = 16;
0627 Param1 = 0;
0628 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0629 Param3 = llvm::PointerType::getUnqual(Int16Ty);
0630 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0631 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0632 break;
0633 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_f16:
0634 Param0 = 16;
0635 Param1 = 1;
0636 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0637 Param3 = llvm::PointerType::getUnqual(HalfTy);
0638 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0639 Param5 = llvm::FixedVectorType::get(HalfTy, 8);
0640 break;
0641 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s16:
0642 Param0 = 16;
0643 Param1 = 1;
0644 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0645 Param3 = llvm::PointerType::getUnqual(Int16Ty);
0646 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0647 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0648 break;
0649 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_s32:
0650 Param0 = 16;
0651 Param1 = 1;
0652 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0653 Param3 = llvm::PointerType::getUnqual(Int16Ty);
0654 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0655 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0656 break;
0657 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u16:
0658 Param0 = 16;
0659 Param1 = 1;
0660 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0661 Param3 = llvm::PointerType::getUnqual(Int16Ty);
0662 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0663 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
0664 break;
0665 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_p_u32:
0666 Param0 = 16;
0667 Param1 = 1;
0668 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0669 Param3 = llvm::PointerType::getUnqual(Int16Ty);
0670 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0671 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0672 break;
0673 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_f32:
0674 Param0 = 32;
0675 Param1 = 0;
0676 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0677 Param3 = llvm::PointerType::getUnqual(FloatTy);
0678 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0679 Param5 = llvm::FixedVectorType::get(FloatTy, 4);
0680 break;
0681 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_s32:
0682 Param0 = 32;
0683 Param1 = 0;
0684 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0685 Param3 = llvm::PointerType::getUnqual(Int32Ty);
0686 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0687 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0688 break;
0689 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_p_u32:
0690 Param0 = 32;
0691 Param1 = 0;
0692 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0693 Param3 = llvm::PointerType::getUnqual(Int32Ty);
0694 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0695 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0696 break;
0697 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_f32:
0698 Param0 = 32;
0699 Param1 = 2;
0700 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0701 Param3 = llvm::PointerType::getUnqual(FloatTy);
0702 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0703 Param5 = llvm::FixedVectorType::get(FloatTy, 4);
0704 break;
0705 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_s32:
0706 Param0 = 32;
0707 Param1 = 2;
0708 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0709 Param3 = llvm::PointerType::getUnqual(Int32Ty);
0710 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0711 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0712 break;
0713 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_p_u32:
0714 Param0 = 32;
0715 Param1 = 2;
0716 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
0717 Param3 = llvm::PointerType::getUnqual(Int32Ty);
0718 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0719 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
0720 break;
0721 }
0722 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0723 Value *Val1 = EmitScalarExpr(E->getArg(1));
0724 Value *Val2 = EmitScalarExpr(E->getArg(2));
0725 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
0726 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
0727 Value *Val5 = EmitScalarExpr(E->getArg(3));
0728 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
0729 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val6});
0730 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_offset_predicated, {Param3, Param4, Param5, Param2}), {(Val0.emitRawPointer(*this)), Val1, Val2, Val3, Val4, Val7});
0731 }
0732 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s16:
0733 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s32:
0734 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s8:
0735 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u16:
0736 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u32:
0737 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u8:
0738 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_s64:
0739 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_u64:
0740 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_s64:
0741 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_u64:
0742 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_f16:
0743 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s16:
0744 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s32:
0745 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u16:
0746 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u32:
0747 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_f16:
0748 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s16:
0749 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s32:
0750 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u16:
0751 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u32:
0752 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_f32:
0753 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_s32:
0754 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_u32:
0755 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_f32:
0756 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_s32:
0757 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_u32: {
0758 uint32_t Param0;
0759 uint32_t Param1;
0760 llvm::Type * Param2;
0761 llvm::Type * Param3;
0762 llvm::Type * Param4;
0763 switch (BuiltinID) {
0764 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s16:
0765 Param0 = 8;
0766 Param1 = 0;
0767 Param2 = llvm::PointerType::getUnqual(Int8Ty);
0768 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0769 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0770 break;
0771 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s32:
0772 Param0 = 8;
0773 Param1 = 0;
0774 Param2 = llvm::PointerType::getUnqual(Int8Ty);
0775 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0776 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0777 break;
0778 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_s8:
0779 Param0 = 8;
0780 Param1 = 0;
0781 Param2 = llvm::PointerType::getUnqual(Int8Ty);
0782 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
0783 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
0784 break;
0785 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u16:
0786 Param0 = 8;
0787 Param1 = 0;
0788 Param2 = llvm::PointerType::getUnqual(Int8Ty);
0789 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0790 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0791 break;
0792 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u32:
0793 Param0 = 8;
0794 Param1 = 0;
0795 Param2 = llvm::PointerType::getUnqual(Int8Ty);
0796 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0797 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0798 break;
0799 case ARM::BI__builtin_arm_mve_vstrbq_scatter_offset_u8:
0800 Param0 = 8;
0801 Param1 = 0;
0802 Param2 = llvm::PointerType::getUnqual(Int8Ty);
0803 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
0804 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
0805 break;
0806 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_s64:
0807 Param0 = 64;
0808 Param1 = 0;
0809 Param2 = llvm::PointerType::getUnqual(Int64Ty);
0810 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
0811 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0812 break;
0813 case ARM::BI__builtin_arm_mve_vstrdq_scatter_offset_u64:
0814 Param0 = 64;
0815 Param1 = 0;
0816 Param2 = llvm::PointerType::getUnqual(Int64Ty);
0817 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
0818 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0819 break;
0820 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_s64:
0821 Param0 = 64;
0822 Param1 = 3;
0823 Param2 = llvm::PointerType::getUnqual(Int64Ty);
0824 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
0825 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0826 break;
0827 case ARM::BI__builtin_arm_mve_vstrdq_scatter_shifted_offset_u64:
0828 Param0 = 64;
0829 Param1 = 3;
0830 Param2 = llvm::PointerType::getUnqual(Int64Ty);
0831 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
0832 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
0833 break;
0834 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_f16:
0835 Param0 = 16;
0836 Param1 = 0;
0837 Param2 = llvm::PointerType::getUnqual(HalfTy);
0838 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0839 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
0840 break;
0841 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s16:
0842 Param0 = 16;
0843 Param1 = 0;
0844 Param2 = llvm::PointerType::getUnqual(Int16Ty);
0845 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0846 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0847 break;
0848 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_s32:
0849 Param0 = 16;
0850 Param1 = 0;
0851 Param2 = llvm::PointerType::getUnqual(Int16Ty);
0852 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0853 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0854 break;
0855 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u16:
0856 Param0 = 16;
0857 Param1 = 0;
0858 Param2 = llvm::PointerType::getUnqual(Int16Ty);
0859 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0860 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0861 break;
0862 case ARM::BI__builtin_arm_mve_vstrhq_scatter_offset_u32:
0863 Param0 = 16;
0864 Param1 = 0;
0865 Param2 = llvm::PointerType::getUnqual(Int16Ty);
0866 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0867 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0868 break;
0869 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_f16:
0870 Param0 = 16;
0871 Param1 = 1;
0872 Param2 = llvm::PointerType::getUnqual(HalfTy);
0873 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0874 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
0875 break;
0876 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s16:
0877 Param0 = 16;
0878 Param1 = 1;
0879 Param2 = llvm::PointerType::getUnqual(Int16Ty);
0880 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0881 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0882 break;
0883 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_s32:
0884 Param0 = 16;
0885 Param1 = 1;
0886 Param2 = llvm::PointerType::getUnqual(Int16Ty);
0887 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0888 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0889 break;
0890 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u16:
0891 Param0 = 16;
0892 Param1 = 1;
0893 Param2 = llvm::PointerType::getUnqual(Int16Ty);
0894 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
0895 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0896 break;
0897 case ARM::BI__builtin_arm_mve_vstrhq_scatter_shifted_offset_u32:
0898 Param0 = 16;
0899 Param1 = 1;
0900 Param2 = llvm::PointerType::getUnqual(Int16Ty);
0901 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0902 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0903 break;
0904 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_f32:
0905 Param0 = 32;
0906 Param1 = 0;
0907 Param2 = llvm::PointerType::getUnqual(FloatTy);
0908 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0909 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
0910 break;
0911 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_s32:
0912 Param0 = 32;
0913 Param1 = 0;
0914 Param2 = llvm::PointerType::getUnqual(Int32Ty);
0915 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0916 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0917 break;
0918 case ARM::BI__builtin_arm_mve_vstrwq_scatter_offset_u32:
0919 Param0 = 32;
0920 Param1 = 0;
0921 Param2 = llvm::PointerType::getUnqual(Int32Ty);
0922 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0923 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0924 break;
0925 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_f32:
0926 Param0 = 32;
0927 Param1 = 2;
0928 Param2 = llvm::PointerType::getUnqual(FloatTy);
0929 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0930 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
0931 break;
0932 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_s32:
0933 Param0 = 32;
0934 Param1 = 2;
0935 Param2 = llvm::PointerType::getUnqual(Int32Ty);
0936 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0937 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0938 break;
0939 case ARM::BI__builtin_arm_mve_vstrwq_scatter_shifted_offset_u32:
0940 Param0 = 32;
0941 Param1 = 2;
0942 Param2 = llvm::PointerType::getUnqual(Int32Ty);
0943 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
0944 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
0945 break;
0946 }
0947 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
0948 Value *Val1 = EmitScalarExpr(E->getArg(1));
0949 Value *Val2 = EmitScalarExpr(E->getArg(2));
0950 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
0951 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
0952 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_offset, {Param2, Param3, Param4}), {(Val0.emitRawPointer(*this)), Val1, Val2, Val3, Val4});
0953 }
0954 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s16:
0955 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s32:
0956 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s8:
0957 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u16:
0958 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u32:
0959 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u8:
0960 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_s64:
0961 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_u64:
0962 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_s64:
0963 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_u64:
0964 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_f16:
0965 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s16:
0966 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s32:
0967 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u16:
0968 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u32:
0969 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_f16:
0970 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s16:
0971 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s32:
0972 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u16:
0973 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u32:
0974 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_f32:
0975 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_s32:
0976 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_u32:
0977 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_f32:
0978 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_s32:
0979 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_u32: {
0980 uint32_t Param0;
0981 uint32_t Param1;
0982 uint32_t Param2;
0983 llvm::Type * Param3;
0984 llvm::Type * Param4;
0985 llvm::Type * Param5;
0986 llvm::Type * Param6;
0987 switch (BuiltinID) {
0988 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s16:
0989 Param0 = 8;
0990 Param1 = 0;
0991 Param2 = 0;
0992 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
0993 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
0994 Param5 = llvm::PointerType::getUnqual(Int8Ty);
0995 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
0996 break;
0997 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s32:
0998 Param0 = 8;
0999 Param1 = 0;
1000 Param2 = 0;
1001 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1002 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1003 Param5 = llvm::PointerType::getUnqual(Int8Ty);
1004 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1005 break;
1006 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_s8:
1007 Param0 = 8;
1008 Param1 = 0;
1009 Param2 = 0;
1010 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1011 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
1012 Param5 = llvm::PointerType::getUnqual(Int8Ty);
1013 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
1014 break;
1015 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u16:
1016 Param0 = 8;
1017 Param1 = 0;
1018 Param2 = 1;
1019 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1020 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
1021 Param5 = llvm::PointerType::getUnqual(Int8Ty);
1022 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1023 break;
1024 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u32:
1025 Param0 = 8;
1026 Param1 = 0;
1027 Param2 = 1;
1028 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1029 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1030 Param5 = llvm::PointerType::getUnqual(Int8Ty);
1031 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1032 break;
1033 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_z_u8:
1034 Param0 = 8;
1035 Param1 = 0;
1036 Param2 = 1;
1037 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1038 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
1039 Param5 = llvm::PointerType::getUnqual(Int8Ty);
1040 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
1041 break;
1042 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_s64:
1043 Param0 = 64;
1044 Param1 = 0;
1045 Param2 = 0;
1046 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
1047 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
1048 Param5 = llvm::PointerType::getUnqual(Int64Ty);
1049 Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
1050 break;
1051 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_z_u64:
1052 Param0 = 64;
1053 Param1 = 0;
1054 Param2 = 1;
1055 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
1056 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
1057 Param5 = llvm::PointerType::getUnqual(Int64Ty);
1058 Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
1059 break;
1060 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_s64:
1061 Param0 = 64;
1062 Param1 = 3;
1063 Param2 = 0;
1064 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
1065 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
1066 Param5 = llvm::PointerType::getUnqual(Int64Ty);
1067 Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
1068 break;
1069 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_z_u64:
1070 Param0 = 64;
1071 Param1 = 3;
1072 Param2 = 1;
1073 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
1074 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
1075 Param5 = llvm::PointerType::getUnqual(Int64Ty);
1076 Param6 = llvm::FixedVectorType::get(Int64Ty, 2);
1077 break;
1078 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_f16:
1079 Param0 = 16;
1080 Param1 = 0;
1081 Param2 = 0;
1082 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1083 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
1084 Param5 = llvm::PointerType::getUnqual(HalfTy);
1085 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1086 break;
1087 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s16:
1088 Param0 = 16;
1089 Param1 = 0;
1090 Param2 = 0;
1091 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1092 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
1093 Param5 = llvm::PointerType::getUnqual(Int16Ty);
1094 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1095 break;
1096 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_s32:
1097 Param0 = 16;
1098 Param1 = 0;
1099 Param2 = 0;
1100 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1101 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1102 Param5 = llvm::PointerType::getUnqual(Int16Ty);
1103 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1104 break;
1105 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u16:
1106 Param0 = 16;
1107 Param1 = 0;
1108 Param2 = 1;
1109 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1110 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
1111 Param5 = llvm::PointerType::getUnqual(Int16Ty);
1112 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1113 break;
1114 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_z_u32:
1115 Param0 = 16;
1116 Param1 = 0;
1117 Param2 = 1;
1118 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1119 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1120 Param5 = llvm::PointerType::getUnqual(Int16Ty);
1121 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1122 break;
1123 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_f16:
1124 Param0 = 16;
1125 Param1 = 1;
1126 Param2 = 0;
1127 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1128 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
1129 Param5 = llvm::PointerType::getUnqual(HalfTy);
1130 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1131 break;
1132 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s16:
1133 Param0 = 16;
1134 Param1 = 1;
1135 Param2 = 0;
1136 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1137 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
1138 Param5 = llvm::PointerType::getUnqual(Int16Ty);
1139 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1140 break;
1141 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_s32:
1142 Param0 = 16;
1143 Param1 = 1;
1144 Param2 = 0;
1145 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1146 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1147 Param5 = llvm::PointerType::getUnqual(Int16Ty);
1148 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1149 break;
1150 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u16:
1151 Param0 = 16;
1152 Param1 = 1;
1153 Param2 = 1;
1154 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1155 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
1156 Param5 = llvm::PointerType::getUnqual(Int16Ty);
1157 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
1158 break;
1159 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_z_u32:
1160 Param0 = 16;
1161 Param1 = 1;
1162 Param2 = 1;
1163 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1164 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1165 Param5 = llvm::PointerType::getUnqual(Int16Ty);
1166 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1167 break;
1168 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_f32:
1169 Param0 = 32;
1170 Param1 = 0;
1171 Param2 = 0;
1172 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1173 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
1174 Param5 = llvm::PointerType::getUnqual(FloatTy);
1175 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1176 break;
1177 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_s32:
1178 Param0 = 32;
1179 Param1 = 0;
1180 Param2 = 0;
1181 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1182 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1183 Param5 = llvm::PointerType::getUnqual(Int32Ty);
1184 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1185 break;
1186 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_z_u32:
1187 Param0 = 32;
1188 Param1 = 0;
1189 Param2 = 1;
1190 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1191 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1192 Param5 = llvm::PointerType::getUnqual(Int32Ty);
1193 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1194 break;
1195 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_f32:
1196 Param0 = 32;
1197 Param1 = 2;
1198 Param2 = 0;
1199 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1200 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
1201 Param5 = llvm::PointerType::getUnqual(FloatTy);
1202 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1203 break;
1204 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_s32:
1205 Param0 = 32;
1206 Param1 = 2;
1207 Param2 = 0;
1208 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1209 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1210 Param5 = llvm::PointerType::getUnqual(Int32Ty);
1211 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1212 break;
1213 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_z_u32:
1214 Param0 = 32;
1215 Param1 = 2;
1216 Param2 = 1;
1217 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1218 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
1219 Param5 = llvm::PointerType::getUnqual(Int32Ty);
1220 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
1221 break;
1222 }
1223 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
1224 Value *Val1 = EmitScalarExpr(E->getArg(1));
1225 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
1226 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
1227 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
1228 Value *Val5 = EmitScalarExpr(E->getArg(2));
1229 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
1230 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
1231 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_offset_predicated, {Param4, Param5, Param6, Param3}), {(Val0.emitRawPointer(*this)), Val1, Val2, Val3, Val4, Val7});
1232 }
1233 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s16:
1234 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s32:
1235 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s8:
1236 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u16:
1237 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u32:
1238 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u8:
1239 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_s64:
1240 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_u64:
1241 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_s64:
1242 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_u64:
1243 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_f16:
1244 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s16:
1245 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s32:
1246 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u16:
1247 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u32:
1248 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_f16:
1249 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s16:
1250 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s32:
1251 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u16:
1252 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u32:
1253 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_f32:
1254 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_s32:
1255 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_u32:
1256 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_f32:
1257 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_s32:
1258 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_u32: {
1259 uint32_t Param0;
1260 uint32_t Param1;
1261 uint32_t Param2;
1262 llvm::Type * Param3;
1263 llvm::Type * Param4;
1264 llvm::Type * Param5;
1265 switch (BuiltinID) {
1266 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s16:
1267 Param0 = 8;
1268 Param1 = 0;
1269 Param2 = 0;
1270 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1271 Param4 = llvm::PointerType::getUnqual(Int8Ty);
1272 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1273 break;
1274 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s32:
1275 Param0 = 8;
1276 Param1 = 0;
1277 Param2 = 0;
1278 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1279 Param4 = llvm::PointerType::getUnqual(Int8Ty);
1280 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1281 break;
1282 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_s8:
1283 Param0 = 8;
1284 Param1 = 0;
1285 Param2 = 0;
1286 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
1287 Param4 = llvm::PointerType::getUnqual(Int8Ty);
1288 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
1289 break;
1290 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u16:
1291 Param0 = 8;
1292 Param1 = 0;
1293 Param2 = 1;
1294 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1295 Param4 = llvm::PointerType::getUnqual(Int8Ty);
1296 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1297 break;
1298 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u32:
1299 Param0 = 8;
1300 Param1 = 0;
1301 Param2 = 1;
1302 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1303 Param4 = llvm::PointerType::getUnqual(Int8Ty);
1304 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1305 break;
1306 case ARM::BI__builtin_arm_mve_vldrbq_gather_offset_u8:
1307 Param0 = 8;
1308 Param1 = 0;
1309 Param2 = 1;
1310 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
1311 Param4 = llvm::PointerType::getUnqual(Int8Ty);
1312 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
1313 break;
1314 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_s64:
1315 Param0 = 64;
1316 Param1 = 0;
1317 Param2 = 0;
1318 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
1319 Param4 = llvm::PointerType::getUnqual(Int64Ty);
1320 Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
1321 break;
1322 case ARM::BI__builtin_arm_mve_vldrdq_gather_offset_u64:
1323 Param0 = 64;
1324 Param1 = 0;
1325 Param2 = 1;
1326 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
1327 Param4 = llvm::PointerType::getUnqual(Int64Ty);
1328 Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
1329 break;
1330 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_s64:
1331 Param0 = 64;
1332 Param1 = 3;
1333 Param2 = 0;
1334 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
1335 Param4 = llvm::PointerType::getUnqual(Int64Ty);
1336 Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
1337 break;
1338 case ARM::BI__builtin_arm_mve_vldrdq_gather_shifted_offset_u64:
1339 Param0 = 64;
1340 Param1 = 3;
1341 Param2 = 1;
1342 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
1343 Param4 = llvm::PointerType::getUnqual(Int64Ty);
1344 Param5 = llvm::FixedVectorType::get(Int64Ty, 2);
1345 break;
1346 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_f16:
1347 Param0 = 16;
1348 Param1 = 0;
1349 Param2 = 0;
1350 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
1351 Param4 = llvm::PointerType::getUnqual(HalfTy);
1352 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1353 break;
1354 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s16:
1355 Param0 = 16;
1356 Param1 = 0;
1357 Param2 = 0;
1358 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1359 Param4 = llvm::PointerType::getUnqual(Int16Ty);
1360 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1361 break;
1362 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_s32:
1363 Param0 = 16;
1364 Param1 = 0;
1365 Param2 = 0;
1366 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1367 Param4 = llvm::PointerType::getUnqual(Int16Ty);
1368 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1369 break;
1370 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u16:
1371 Param0 = 16;
1372 Param1 = 0;
1373 Param2 = 1;
1374 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1375 Param4 = llvm::PointerType::getUnqual(Int16Ty);
1376 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1377 break;
1378 case ARM::BI__builtin_arm_mve_vldrhq_gather_offset_u32:
1379 Param0 = 16;
1380 Param1 = 0;
1381 Param2 = 1;
1382 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1383 Param4 = llvm::PointerType::getUnqual(Int16Ty);
1384 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1385 break;
1386 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_f16:
1387 Param0 = 16;
1388 Param1 = 1;
1389 Param2 = 0;
1390 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
1391 Param4 = llvm::PointerType::getUnqual(HalfTy);
1392 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1393 break;
1394 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s16:
1395 Param0 = 16;
1396 Param1 = 1;
1397 Param2 = 0;
1398 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1399 Param4 = llvm::PointerType::getUnqual(Int16Ty);
1400 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1401 break;
1402 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_s32:
1403 Param0 = 16;
1404 Param1 = 1;
1405 Param2 = 0;
1406 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1407 Param4 = llvm::PointerType::getUnqual(Int16Ty);
1408 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1409 break;
1410 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u16:
1411 Param0 = 16;
1412 Param1 = 1;
1413 Param2 = 1;
1414 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
1415 Param4 = llvm::PointerType::getUnqual(Int16Ty);
1416 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
1417 break;
1418 case ARM::BI__builtin_arm_mve_vldrhq_gather_shifted_offset_u32:
1419 Param0 = 16;
1420 Param1 = 1;
1421 Param2 = 1;
1422 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1423 Param4 = llvm::PointerType::getUnqual(Int16Ty);
1424 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1425 break;
1426 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_f32:
1427 Param0 = 32;
1428 Param1 = 0;
1429 Param2 = 0;
1430 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
1431 Param4 = llvm::PointerType::getUnqual(FloatTy);
1432 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1433 break;
1434 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_s32:
1435 Param0 = 32;
1436 Param1 = 0;
1437 Param2 = 0;
1438 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1439 Param4 = llvm::PointerType::getUnqual(Int32Ty);
1440 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1441 break;
1442 case ARM::BI__builtin_arm_mve_vldrwq_gather_offset_u32:
1443 Param0 = 32;
1444 Param1 = 0;
1445 Param2 = 1;
1446 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1447 Param4 = llvm::PointerType::getUnqual(Int32Ty);
1448 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1449 break;
1450 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_f32:
1451 Param0 = 32;
1452 Param1 = 2;
1453 Param2 = 0;
1454 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
1455 Param4 = llvm::PointerType::getUnqual(FloatTy);
1456 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1457 break;
1458 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_s32:
1459 Param0 = 32;
1460 Param1 = 2;
1461 Param2 = 0;
1462 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1463 Param4 = llvm::PointerType::getUnqual(Int32Ty);
1464 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1465 break;
1466 case ARM::BI__builtin_arm_mve_vldrwq_gather_shifted_offset_u32:
1467 Param0 = 32;
1468 Param1 = 2;
1469 Param2 = 1;
1470 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
1471 Param4 = llvm::PointerType::getUnqual(Int32Ty);
1472 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
1473 break;
1474 }
1475 Address Val0 = EmitPointerWithAlignment(E->getArg(0));
1476 Value *Val1 = EmitScalarExpr(E->getArg(1));
1477 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
1478 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
1479 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
1480 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_offset, {Param3, Param4, Param5}), {(Val0.emitRawPointer(*this)), Val1, Val2, Val3, Val4});
1481 }
1482 case ARM::BI__builtin_arm_mve_vshlcq_s16:
1483 case ARM::BI__builtin_arm_mve_vshlcq_s32:
1484 case ARM::BI__builtin_arm_mve_vshlcq_s8:
1485 case ARM::BI__builtin_arm_mve_vshlcq_u16:
1486 case ARM::BI__builtin_arm_mve_vshlcq_u32:
1487 case ARM::BI__builtin_arm_mve_vshlcq_u8: {
1488 llvm::Type * Param0;
1489 switch (BuiltinID) {
1490 case ARM::BI__builtin_arm_mve_vshlcq_s16:
1491 Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
1492 break;
1493 case ARM::BI__builtin_arm_mve_vshlcq_s32:
1494 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
1495 break;
1496 case ARM::BI__builtin_arm_mve_vshlcq_s8:
1497 Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
1498 break;
1499 case ARM::BI__builtin_arm_mve_vshlcq_u16:
1500 Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
1501 break;
1502 case ARM::BI__builtin_arm_mve_vshlcq_u32:
1503 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
1504 break;
1505 case ARM::BI__builtin_arm_mve_vshlcq_u8:
1506 Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
1507 break;
1508 }
1509 Address Val0 = EmitPointerWithAlignment(E->getArg(1));
1510 Value *Val1 = Builder.CreateLoad(Val0);
1511 Value *Val2 = EmitScalarExpr(E->getArg(0));
1512 Value *Val3 = EmitScalarExpr(E->getArg(2));
1513 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshlc, {Param0}), {Val2, Val1, Val3});
1514 Value *Val5 = Builder.CreateExtractValue(Val4, static_cast<unsigned>(0));
1515 Builder.CreateStore(Val5, Val0);
1516 return Builder.CreateExtractValue(Val4, static_cast<unsigned>(1));
1517 }
1518 case ARM::BI__builtin_arm_mve_vddupq_m_wb_u16:
1519 case ARM::BI__builtin_arm_mve_vddupq_m_wb_u32:
1520 case ARM::BI__builtin_arm_mve_vddupq_m_wb_u8:
1521 case ARM::BI__builtin_arm_mve_vidupq_m_wb_u16:
1522 case ARM::BI__builtin_arm_mve_vidupq_m_wb_u32:
1523 case ARM::BI__builtin_arm_mve_vidupq_m_wb_u8:
1524 case ARM::BI__builtin_arm_mve_vshlcq_m_s16:
1525 case ARM::BI__builtin_arm_mve_vshlcq_m_s32:
1526 case ARM::BI__builtin_arm_mve_vshlcq_m_s8:
1527 case ARM::BI__builtin_arm_mve_vshlcq_m_u16:
1528 case ARM::BI__builtin_arm_mve_vshlcq_m_u32:
1529 case ARM::BI__builtin_arm_mve_vshlcq_m_u8: {
1530 llvm::Type * Param0;
1531 Intrinsic::ID Param1;
1532 llvm::Type * Param2;
1533 unsigned Param3;
1534 unsigned Param4;
1535 switch (BuiltinID) {
1536 case ARM::BI__builtin_arm_mve_vddupq_m_wb_u16:
1537 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1538 Param1 = Intrinsic::arm_mve_vddup_predicated;
1539 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1540 Param3 = 1;
1541 Param4 = 0;
1542 break;
1543 case ARM::BI__builtin_arm_mve_vddupq_m_wb_u32:
1544 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1545 Param1 = Intrinsic::arm_mve_vddup_predicated;
1546 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1547 Param3 = 1;
1548 Param4 = 0;
1549 break;
1550 case ARM::BI__builtin_arm_mve_vddupq_m_wb_u8:
1551 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1552 Param1 = Intrinsic::arm_mve_vddup_predicated;
1553 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1554 Param3 = 1;
1555 Param4 = 0;
1556 break;
1557 case ARM::BI__builtin_arm_mve_vidupq_m_wb_u16:
1558 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1559 Param1 = Intrinsic::arm_mve_vidup_predicated;
1560 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1561 Param3 = 1;
1562 Param4 = 0;
1563 break;
1564 case ARM::BI__builtin_arm_mve_vidupq_m_wb_u32:
1565 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1566 Param1 = Intrinsic::arm_mve_vidup_predicated;
1567 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1568 Param3 = 1;
1569 Param4 = 0;
1570 break;
1571 case ARM::BI__builtin_arm_mve_vidupq_m_wb_u8:
1572 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1573 Param1 = Intrinsic::arm_mve_vidup_predicated;
1574 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1575 Param3 = 1;
1576 Param4 = 0;
1577 break;
1578 case ARM::BI__builtin_arm_mve_vshlcq_m_s16:
1579 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1580 Param1 = Intrinsic::arm_mve_vshlc_predicated;
1581 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1582 Param3 = 0;
1583 Param4 = 1;
1584 break;
1585 case ARM::BI__builtin_arm_mve_vshlcq_m_s32:
1586 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1587 Param1 = Intrinsic::arm_mve_vshlc_predicated;
1588 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1589 Param3 = 0;
1590 Param4 = 1;
1591 break;
1592 case ARM::BI__builtin_arm_mve_vshlcq_m_s8:
1593 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1594 Param1 = Intrinsic::arm_mve_vshlc_predicated;
1595 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1596 Param3 = 0;
1597 Param4 = 1;
1598 break;
1599 case ARM::BI__builtin_arm_mve_vshlcq_m_u16:
1600 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1601 Param1 = Intrinsic::arm_mve_vshlc_predicated;
1602 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1603 Param3 = 0;
1604 Param4 = 1;
1605 break;
1606 case ARM::BI__builtin_arm_mve_vshlcq_m_u32:
1607 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1608 Param1 = Intrinsic::arm_mve_vshlc_predicated;
1609 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1610 Param3 = 0;
1611 Param4 = 1;
1612 break;
1613 case ARM::BI__builtin_arm_mve_vshlcq_m_u8:
1614 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1615 Param1 = Intrinsic::arm_mve_vshlc_predicated;
1616 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1617 Param3 = 0;
1618 Param4 = 1;
1619 break;
1620 }
1621 Address Val0 = EmitPointerWithAlignment(E->getArg(1));
1622 Value *Val1 = Builder.CreateLoad(Val0);
1623 Value *Val2 = EmitScalarExpr(E->getArg(0));
1624 Value *Val3 = EmitScalarExpr(E->getArg(2));
1625 Value *Val4 = EmitScalarExpr(E->getArg(3));
1626 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
1627 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
1628 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val2, Val1, Val3, Val6});
1629 Value *Val8 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(Param3));
1630 Builder.CreateStore(Val8, Val0);
1631 return Builder.CreateExtractValue(Val7, static_cast<unsigned>(Param4));
1632 }
1633 case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u16:
1634 case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u32:
1635 case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u8:
1636 case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u16:
1637 case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u32:
1638 case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u8: {
1639 llvm::Type * Param0;
1640 Intrinsic::ID Param1;
1641 llvm::Type * Param2;
1642 switch (BuiltinID) {
1643 case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u16:
1644 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1645 Param1 = Intrinsic::arm_mve_vdwdup_predicated;
1646 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1647 break;
1648 case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u32:
1649 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1650 Param1 = Intrinsic::arm_mve_vdwdup_predicated;
1651 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1652 break;
1653 case ARM::BI__builtin_arm_mve_vdwdupq_m_wb_u8:
1654 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1655 Param1 = Intrinsic::arm_mve_vdwdup_predicated;
1656 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1657 break;
1658 case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u16:
1659 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1660 Param1 = Intrinsic::arm_mve_viwdup_predicated;
1661 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1662 break;
1663 case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u32:
1664 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1665 Param1 = Intrinsic::arm_mve_viwdup_predicated;
1666 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
1667 break;
1668 case ARM::BI__builtin_arm_mve_viwdupq_m_wb_u8:
1669 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1670 Param1 = Intrinsic::arm_mve_viwdup_predicated;
1671 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1672 break;
1673 }
1674 Address Val0 = EmitPointerWithAlignment(E->getArg(1));
1675 Value *Val1 = Builder.CreateLoad(Val0);
1676 Value *Val2 = EmitScalarExpr(E->getArg(0));
1677 Value *Val3 = EmitScalarExpr(E->getArg(2));
1678 Value *Val4 = EmitScalarExpr(E->getArg(3));
1679 Value *Val5 = EmitScalarExpr(E->getArg(4));
1680 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
1681 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val6});
1682 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val2, Val1, Val3, Val4, Val7});
1683 Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
1684 Builder.CreateStore(Val9, Val0);
1685 return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
1686 }
1687 case ARM::BI__builtin_arm_mve_vld2q_f16:
1688 case ARM::BI__builtin_arm_mve_vld2q_f32:
1689 case ARM::BI__builtin_arm_mve_vld2q_s16:
1690 case ARM::BI__builtin_arm_mve_vld2q_s32:
1691 case ARM::BI__builtin_arm_mve_vld2q_s8:
1692 case ARM::BI__builtin_arm_mve_vld2q_u16:
1693 case ARM::BI__builtin_arm_mve_vld2q_u32:
1694 case ARM::BI__builtin_arm_mve_vld2q_u8: {
1695 CustomCodeGenType = CustomCodeGen::VLD24;
1696 IRIntr = Intrinsic::arm_mve_vld2q;
1697 NumVectors = 2;
1698 break; // custom code gen
1699 }
1700 case ARM::BI__builtin_arm_mve_vld4q_f16:
1701 case ARM::BI__builtin_arm_mve_vld4q_f32:
1702 case ARM::BI__builtin_arm_mve_vld4q_s16:
1703 case ARM::BI__builtin_arm_mve_vld4q_s32:
1704 case ARM::BI__builtin_arm_mve_vld4q_s8:
1705 case ARM::BI__builtin_arm_mve_vld4q_u16:
1706 case ARM::BI__builtin_arm_mve_vld4q_u32:
1707 case ARM::BI__builtin_arm_mve_vld4q_u8: {
1708 CustomCodeGenType = CustomCodeGen::VLD24;
1709 IRIntr = Intrinsic::arm_mve_vld4q;
1710 NumVectors = 4;
1711 break; // custom code gen
1712 }
1713 case ARM::BI__builtin_arm_mve_vst2q_f16:
1714 case ARM::BI__builtin_arm_mve_vst2q_f32:
1715 case ARM::BI__builtin_arm_mve_vst2q_s16:
1716 case ARM::BI__builtin_arm_mve_vst2q_s32:
1717 case ARM::BI__builtin_arm_mve_vst2q_s8:
1718 case ARM::BI__builtin_arm_mve_vst2q_u16:
1719 case ARM::BI__builtin_arm_mve_vst2q_u32:
1720 case ARM::BI__builtin_arm_mve_vst2q_u8: {
1721 CustomCodeGenType = CustomCodeGen::VST24;
1722 IRIntr = Intrinsic::arm_mve_vst2q;
1723 NumVectors = 2;
1724 break; // custom code gen
1725 }
1726 case ARM::BI__builtin_arm_mve_vst4q_f16:
1727 case ARM::BI__builtin_arm_mve_vst4q_f32:
1728 case ARM::BI__builtin_arm_mve_vst4q_s16:
1729 case ARM::BI__builtin_arm_mve_vst4q_s32:
1730 case ARM::BI__builtin_arm_mve_vst4q_s8:
1731 case ARM::BI__builtin_arm_mve_vst4q_u16:
1732 case ARM::BI__builtin_arm_mve_vst4q_u32:
1733 case ARM::BI__builtin_arm_mve_vst4q_u8: {
1734 CustomCodeGenType = CustomCodeGen::VST24;
1735 IRIntr = Intrinsic::arm_mve_vst4q;
1736 NumVectors = 4;
1737 break; // custom code gen
1738 }
1739 case ARM::BI__builtin_arm_mve_vmaxnmaq_f16:
1740 case ARM::BI__builtin_arm_mve_vmaxnmaq_f32:
1741 case ARM::BI__builtin_arm_mve_vminnmaq_f16:
1742 case ARM::BI__builtin_arm_mve_vminnmaq_f32: {
1743 llvm::Type * Param0;
1744 Intrinsic::ID Param1;
1745 switch (BuiltinID) {
1746 case ARM::BI__builtin_arm_mve_vmaxnmaq_f16:
1747 Param0 = llvm::FixedVectorType::get(HalfTy, 8);
1748 Param1 = Intrinsic::maxnum;
1749 break;
1750 case ARM::BI__builtin_arm_mve_vmaxnmaq_f32:
1751 Param0 = llvm::FixedVectorType::get(FloatTy, 4);
1752 Param1 = Intrinsic::maxnum;
1753 break;
1754 case ARM::BI__builtin_arm_mve_vminnmaq_f16:
1755 Param0 = llvm::FixedVectorType::get(HalfTy, 8);
1756 Param1 = Intrinsic::minnum;
1757 break;
1758 case ARM::BI__builtin_arm_mve_vminnmaq_f32:
1759 Param0 = llvm::FixedVectorType::get(FloatTy, 4);
1760 Param1 = Intrinsic::minnum;
1761 break;
1762 }
1763 Value *Val0 = EmitScalarExpr(E->getArg(0));
1764 Value *Val1 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fabs, {Param0}), {Val0});
1765 Value *Val2 = EmitScalarExpr(E->getArg(1));
1766 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fabs, {Param0}), {Val2});
1767 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param0}), {Val1, Val3});
1768 }
1769 case ARM::BI__builtin_arm_mve_vctp16q:
1770 case ARM::BI__builtin_arm_mve_vctp32q:
1771 case ARM::BI__builtin_arm_mve_vctp64q:
1772 case ARM::BI__builtin_arm_mve_vctp8q: {
1773 Intrinsic::ID Param0;
1774 llvm::Type * Param1;
1775 switch (BuiltinID) {
1776 case ARM::BI__builtin_arm_mve_vctp16q:
1777 Param0 = Intrinsic::arm_mve_vctp16;
1778 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1779 break;
1780 case ARM::BI__builtin_arm_mve_vctp32q:
1781 Param0 = Intrinsic::arm_mve_vctp32;
1782 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
1783 break;
1784 case ARM::BI__builtin_arm_mve_vctp64q:
1785 Param0 = Intrinsic::arm_mve_vctp64;
1786 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
1787 break;
1788 case ARM::BI__builtin_arm_mve_vctp8q:
1789 Param0 = Intrinsic::arm_mve_vctp8;
1790 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1791 break;
1792 }
1793 Value *Val0 = EmitScalarExpr(E->getArg(0));
1794 Value *Val1 = Builder.CreateCall(CGM.getIntrinsic(Param0), {Val0});
1795 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param1}), {Val1});
1796 return Builder.CreateIntCast(Val2, Int16Ty, false);
1797 }
1798 case ARM::BI__builtin_arm_mve_vmvnq_n_s32:
1799 case ARM::BI__builtin_arm_mve_vmvnq_n_u32: {
1800 bool Param0;
1801 switch (BuiltinID) {
1802 case ARM::BI__builtin_arm_mve_vmvnq_n_s32:
1803 Param0 = true;
1804 break;
1805 case ARM::BI__builtin_arm_mve_vmvnq_n_u32:
1806 Param0 = false;
1807 break;
1808 }
1809 Value *Val0 = EmitScalarExpr(E->getArg(0));
1810 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, Param0);
1811 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
1812 return Builder.CreateNot(Val2);
1813 }
1814 case ARM::BI__builtin_arm_mve_vmvnq_n_s16:
1815 case ARM::BI__builtin_arm_mve_vmvnq_n_u16: {
1816 bool Param0;
1817 switch (BuiltinID) {
1818 case ARM::BI__builtin_arm_mve_vmvnq_n_s16:
1819 Param0 = true;
1820 break;
1821 case ARM::BI__builtin_arm_mve_vmvnq_n_u16:
1822 Param0 = false;
1823 break;
1824 }
1825 Value *Val0 = EmitScalarExpr(E->getArg(0));
1826 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
1827 Value *Val2 = Builder.CreateIntCast(Val1, Int16Ty, Param0);
1828 Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
1829 return Builder.CreateNot(Val3);
1830 }
1831 case ARM::BI__builtin_arm_mve_vmaxavq_s16:
1832 case ARM::BI__builtin_arm_mve_vmaxavq_s8:
1833 case ARM::BI__builtin_arm_mve_vminavq_s16:
1834 case ARM::BI__builtin_arm_mve_vminavq_s8: {
1835 Intrinsic::ID Param0;
1836 llvm::Type * Param1;
1837 llvm::Type * Param2;
1838 switch (BuiltinID) {
1839 case ARM::BI__builtin_arm_mve_vmaxavq_s16:
1840 Param0 = Intrinsic::arm_mve_maxav;
1841 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
1842 Param2 = Int16Ty;
1843 break;
1844 case ARM::BI__builtin_arm_mve_vmaxavq_s8:
1845 Param0 = Intrinsic::arm_mve_maxav;
1846 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
1847 Param2 = Int8Ty;
1848 break;
1849 case ARM::BI__builtin_arm_mve_vminavq_s16:
1850 Param0 = Intrinsic::arm_mve_minav;
1851 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
1852 Param2 = Int16Ty;
1853 break;
1854 case ARM::BI__builtin_arm_mve_vminavq_s8:
1855 Param0 = Intrinsic::arm_mve_minav;
1856 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
1857 Param2 = Int8Ty;
1858 break;
1859 }
1860 Value *Val0 = EmitScalarExpr(E->getArg(0));
1861 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
1862 Value *Val2 = EmitScalarExpr(E->getArg(1));
1863 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val1, Val2});
1864 return Builder.CreateIntCast(Val3, Param2, false);
1865 }
1866 case ARM::BI__builtin_arm_mve_vmaxavq_p_s16:
1867 case ARM::BI__builtin_arm_mve_vmaxavq_p_s8:
1868 case ARM::BI__builtin_arm_mve_vminavq_p_s16:
1869 case ARM::BI__builtin_arm_mve_vminavq_p_s8: {
1870 llvm::Type * Param0;
1871 Intrinsic::ID Param1;
1872 llvm::Type * Param2;
1873 llvm::Type * Param3;
1874 switch (BuiltinID) {
1875 case ARM::BI__builtin_arm_mve_vmaxavq_p_s16:
1876 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1877 Param1 = Intrinsic::arm_mve_maxav_predicated;
1878 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1879 Param3 = Int16Ty;
1880 break;
1881 case ARM::BI__builtin_arm_mve_vmaxavq_p_s8:
1882 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1883 Param1 = Intrinsic::arm_mve_maxav_predicated;
1884 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1885 Param3 = Int8Ty;
1886 break;
1887 case ARM::BI__builtin_arm_mve_vminavq_p_s16:
1888 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
1889 Param1 = Intrinsic::arm_mve_minav_predicated;
1890 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1891 Param3 = Int16Ty;
1892 break;
1893 case ARM::BI__builtin_arm_mve_vminavq_p_s8:
1894 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
1895 Param1 = Intrinsic::arm_mve_minav_predicated;
1896 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1897 Param3 = Int8Ty;
1898 break;
1899 }
1900 Value *Val0 = EmitScalarExpr(E->getArg(0));
1901 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
1902 Value *Val2 = EmitScalarExpr(E->getArg(1));
1903 Value *Val3 = EmitScalarExpr(E->getArg(2));
1904 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
1905 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
1906 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val1, Val2, Val5});
1907 return Builder.CreateIntCast(Val6, Param3, false);
1908 }
1909 case ARM::BI__builtin_arm_mve_vmaxvq_s16:
1910 case ARM::BI__builtin_arm_mve_vmaxvq_s8:
1911 case ARM::BI__builtin_arm_mve_vmaxvq_u16:
1912 case ARM::BI__builtin_arm_mve_vmaxvq_u8:
1913 case ARM::BI__builtin_arm_mve_vminvq_s16:
1914 case ARM::BI__builtin_arm_mve_vminvq_s8:
1915 case ARM::BI__builtin_arm_mve_vminvq_u16:
1916 case ARM::BI__builtin_arm_mve_vminvq_u8: {
1917 uint32_t Param0;
1918 Intrinsic::ID Param1;
1919 llvm::Type * Param2;
1920 llvm::Type * Param3;
1921 bool Param4;
1922 switch (BuiltinID) {
1923 case ARM::BI__builtin_arm_mve_vmaxvq_s16:
1924 Param0 = 0;
1925 Param1 = Intrinsic::arm_mve_maxv;
1926 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1927 Param3 = Int16Ty;
1928 Param4 = true;
1929 break;
1930 case ARM::BI__builtin_arm_mve_vmaxvq_s8:
1931 Param0 = 0;
1932 Param1 = Intrinsic::arm_mve_maxv;
1933 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1934 Param3 = Int8Ty;
1935 Param4 = true;
1936 break;
1937 case ARM::BI__builtin_arm_mve_vmaxvq_u16:
1938 Param0 = 1;
1939 Param1 = Intrinsic::arm_mve_maxv;
1940 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1941 Param3 = Int16Ty;
1942 Param4 = false;
1943 break;
1944 case ARM::BI__builtin_arm_mve_vmaxvq_u8:
1945 Param0 = 1;
1946 Param1 = Intrinsic::arm_mve_maxv;
1947 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1948 Param3 = Int8Ty;
1949 Param4 = false;
1950 break;
1951 case ARM::BI__builtin_arm_mve_vminvq_s16:
1952 Param0 = 0;
1953 Param1 = Intrinsic::arm_mve_minv;
1954 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1955 Param3 = Int16Ty;
1956 Param4 = true;
1957 break;
1958 case ARM::BI__builtin_arm_mve_vminvq_s8:
1959 Param0 = 0;
1960 Param1 = Intrinsic::arm_mve_minv;
1961 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1962 Param3 = Int8Ty;
1963 Param4 = true;
1964 break;
1965 case ARM::BI__builtin_arm_mve_vminvq_u16:
1966 Param0 = 1;
1967 Param1 = Intrinsic::arm_mve_minv;
1968 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
1969 Param3 = Int16Ty;
1970 Param4 = false;
1971 break;
1972 case ARM::BI__builtin_arm_mve_vminvq_u8:
1973 Param0 = 1;
1974 Param1 = Intrinsic::arm_mve_minv;
1975 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
1976 Param3 = Int8Ty;
1977 Param4 = false;
1978 break;
1979 }
1980 Value *Val0 = EmitScalarExpr(E->getArg(0));
1981 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
1982 Value *Val2 = EmitScalarExpr(E->getArg(1));
1983 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
1984 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val1, Val2, Val3});
1985 return Builder.CreateIntCast(Val4, Param3, Param4);
1986 }
1987 case ARM::BI__builtin_arm_mve_vmaxvq_p_s16:
1988 case ARM::BI__builtin_arm_mve_vmaxvq_p_s8:
1989 case ARM::BI__builtin_arm_mve_vmaxvq_p_u16:
1990 case ARM::BI__builtin_arm_mve_vmaxvq_p_u8:
1991 case ARM::BI__builtin_arm_mve_vminvq_p_s16:
1992 case ARM::BI__builtin_arm_mve_vminvq_p_s8:
1993 case ARM::BI__builtin_arm_mve_vminvq_p_u16:
1994 case ARM::BI__builtin_arm_mve_vminvq_p_u8: {
1995 uint32_t Param0;
1996 llvm::Type * Param1;
1997 Intrinsic::ID Param2;
1998 llvm::Type * Param3;
1999 llvm::Type * Param4;
2000 bool Param5;
2001 switch (BuiltinID) {
2002 case ARM::BI__builtin_arm_mve_vmaxvq_p_s16:
2003 Param0 = 0;
2004 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2005 Param2 = Intrinsic::arm_mve_maxv_predicated;
2006 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
2007 Param4 = Int16Ty;
2008 Param5 = true;
2009 break;
2010 case ARM::BI__builtin_arm_mve_vmaxvq_p_s8:
2011 Param0 = 0;
2012 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2013 Param2 = Intrinsic::arm_mve_maxv_predicated;
2014 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
2015 Param4 = Int8Ty;
2016 Param5 = true;
2017 break;
2018 case ARM::BI__builtin_arm_mve_vmaxvq_p_u16:
2019 Param0 = 1;
2020 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2021 Param2 = Intrinsic::arm_mve_maxv_predicated;
2022 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
2023 Param4 = Int16Ty;
2024 Param5 = false;
2025 break;
2026 case ARM::BI__builtin_arm_mve_vmaxvq_p_u8:
2027 Param0 = 1;
2028 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2029 Param2 = Intrinsic::arm_mve_maxv_predicated;
2030 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
2031 Param4 = Int8Ty;
2032 Param5 = false;
2033 break;
2034 case ARM::BI__builtin_arm_mve_vminvq_p_s16:
2035 Param0 = 0;
2036 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2037 Param2 = Intrinsic::arm_mve_minv_predicated;
2038 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
2039 Param4 = Int16Ty;
2040 Param5 = true;
2041 break;
2042 case ARM::BI__builtin_arm_mve_vminvq_p_s8:
2043 Param0 = 0;
2044 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2045 Param2 = Intrinsic::arm_mve_minv_predicated;
2046 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
2047 Param4 = Int8Ty;
2048 Param5 = true;
2049 break;
2050 case ARM::BI__builtin_arm_mve_vminvq_p_u16:
2051 Param0 = 1;
2052 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2053 Param2 = Intrinsic::arm_mve_minv_predicated;
2054 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
2055 Param4 = Int16Ty;
2056 Param5 = false;
2057 break;
2058 case ARM::BI__builtin_arm_mve_vminvq_p_u8:
2059 Param0 = 1;
2060 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2061 Param2 = Intrinsic::arm_mve_minv_predicated;
2062 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
2063 Param4 = Int8Ty;
2064 Param5 = false;
2065 break;
2066 }
2067 Value *Val0 = EmitScalarExpr(E->getArg(0));
2068 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
2069 Value *Val2 = EmitScalarExpr(E->getArg(1));
2070 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
2071 Value *Val4 = EmitScalarExpr(E->getArg(2));
2072 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
2073 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
2074 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val1, Val2, Val3, Val6});
2075 return Builder.CreateIntCast(Val7, Param4, Param5);
2076 }
2077 case ARM::BI__builtin_arm_mve_vadcq_s32:
2078 case ARM::BI__builtin_arm_mve_vadcq_u32:
2079 case ARM::BI__builtin_arm_mve_vsbcq_s32:
2080 case ARM::BI__builtin_arm_mve_vsbcq_u32: {
2081 Intrinsic::ID Param0;
2082 switch (BuiltinID) {
2083 case ARM::BI__builtin_arm_mve_vadcq_s32:
2084 Param0 = Intrinsic::arm_mve_vadc;
2085 break;
2086 case ARM::BI__builtin_arm_mve_vadcq_u32:
2087 Param0 = Intrinsic::arm_mve_vadc;
2088 break;
2089 case ARM::BI__builtin_arm_mve_vsbcq_s32:
2090 Param0 = Intrinsic::arm_mve_vsbc;
2091 break;
2092 case ARM::BI__builtin_arm_mve_vsbcq_u32:
2093 Param0 = Intrinsic::arm_mve_vsbc;
2094 break;
2095 }
2096 Value *Val0 = EmitScalarExpr(E->getArg(0));
2097 Value *Val1 = EmitScalarExpr(E->getArg(1));
2098 Address Val2 = EmitPointerWithAlignment(E->getArg(2));
2099 Value *Val3 = Builder.CreateLoad(Val2);
2100 Value *Val4 = llvm::ConstantInt::get(Int32Ty, 29);
2101 Value *Val5 = Builder.CreateShl(Val3, Val4);
2102 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val5});
2103 Value *Val7 = llvm::ConstantInt::get(Int32Ty, 1);
2104 Value *Val8 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(1));
2105 Value *Val9 = llvm::ConstantInt::get(Int32Ty, 29);
2106 Value *Val10 = Builder.CreateLShr(Val8, Val9);
2107 Value *Val11 = Builder.CreateAnd(Val7, Val10);
2108 Builder.CreateStore(Val11, Val2);
2109 return Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
2110 }
2111 case ARM::BI__builtin_arm_mve_vcmpeqq_n_f16:
2112 case ARM::BI__builtin_arm_mve_vcmpeqq_n_f32: {
2113 llvm::Type * Param0;
2114 switch (BuiltinID) {
2115 case ARM::BI__builtin_arm_mve_vcmpeqq_n_f16:
2116 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2117 break;
2118 case ARM::BI__builtin_arm_mve_vcmpeqq_n_f32:
2119 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2120 break;
2121 }
2122 Value *Val0 = EmitScalarExpr(E->getArg(0));
2123 Value *Val1 = EmitScalarExpr(E->getArg(1));
2124 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2125 Value *Val3 = Builder.CreateFCmpOEQ(Val0, Val2);
2126 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2127 return Builder.CreateIntCast(Val4, Int16Ty, false);
2128 }
2129 case ARM::BI__builtin_arm_mve_vcmpgeq_n_f16:
2130 case ARM::BI__builtin_arm_mve_vcmpgeq_n_f32: {
2131 llvm::Type * Param0;
2132 switch (BuiltinID) {
2133 case ARM::BI__builtin_arm_mve_vcmpgeq_n_f16:
2134 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2135 break;
2136 case ARM::BI__builtin_arm_mve_vcmpgeq_n_f32:
2137 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2138 break;
2139 }
2140 Value *Val0 = EmitScalarExpr(E->getArg(0));
2141 Value *Val1 = EmitScalarExpr(E->getArg(1));
2142 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2143 Value *Val3 = Builder.CreateFCmpOGE(Val0, Val2);
2144 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2145 return Builder.CreateIntCast(Val4, Int16Ty, false);
2146 }
2147 case ARM::BI__builtin_arm_mve_vcmpgtq_n_f16:
2148 case ARM::BI__builtin_arm_mve_vcmpgtq_n_f32: {
2149 llvm::Type * Param0;
2150 switch (BuiltinID) {
2151 case ARM::BI__builtin_arm_mve_vcmpgtq_n_f16:
2152 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2153 break;
2154 case ARM::BI__builtin_arm_mve_vcmpgtq_n_f32:
2155 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2156 break;
2157 }
2158 Value *Val0 = EmitScalarExpr(E->getArg(0));
2159 Value *Val1 = EmitScalarExpr(E->getArg(1));
2160 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2161 Value *Val3 = Builder.CreateFCmpOGT(Val0, Val2);
2162 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2163 return Builder.CreateIntCast(Val4, Int16Ty, false);
2164 }
2165 case ARM::BI__builtin_arm_mve_vcmpleq_n_f16:
2166 case ARM::BI__builtin_arm_mve_vcmpleq_n_f32: {
2167 llvm::Type * Param0;
2168 switch (BuiltinID) {
2169 case ARM::BI__builtin_arm_mve_vcmpleq_n_f16:
2170 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2171 break;
2172 case ARM::BI__builtin_arm_mve_vcmpleq_n_f32:
2173 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2174 break;
2175 }
2176 Value *Val0 = EmitScalarExpr(E->getArg(0));
2177 Value *Val1 = EmitScalarExpr(E->getArg(1));
2178 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2179 Value *Val3 = Builder.CreateFCmpULE(Val0, Val2);
2180 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2181 return Builder.CreateIntCast(Val4, Int16Ty, false);
2182 }
2183 case ARM::BI__builtin_arm_mve_vcmpltq_n_f16:
2184 case ARM::BI__builtin_arm_mve_vcmpltq_n_f32: {
2185 llvm::Type * Param0;
2186 switch (BuiltinID) {
2187 case ARM::BI__builtin_arm_mve_vcmpltq_n_f16:
2188 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2189 break;
2190 case ARM::BI__builtin_arm_mve_vcmpltq_n_f32:
2191 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2192 break;
2193 }
2194 Value *Val0 = EmitScalarExpr(E->getArg(0));
2195 Value *Val1 = EmitScalarExpr(E->getArg(1));
2196 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2197 Value *Val3 = Builder.CreateFCmpULT(Val0, Val2);
2198 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2199 return Builder.CreateIntCast(Val4, Int16Ty, false);
2200 }
2201 case ARM::BI__builtin_arm_mve_vcmpneq_n_f16:
2202 case ARM::BI__builtin_arm_mve_vcmpneq_n_f32: {
2203 llvm::Type * Param0;
2204 switch (BuiltinID) {
2205 case ARM::BI__builtin_arm_mve_vcmpneq_n_f16:
2206 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2207 break;
2208 case ARM::BI__builtin_arm_mve_vcmpneq_n_f32:
2209 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2210 break;
2211 }
2212 Value *Val0 = EmitScalarExpr(E->getArg(0));
2213 Value *Val1 = EmitScalarExpr(E->getArg(1));
2214 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2215 Value *Val3 = Builder.CreateFCmpUNE(Val0, Val2);
2216 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2217 return Builder.CreateIntCast(Val4, Int16Ty, false);
2218 }
2219 case ARM::BI__builtin_arm_mve_vcmpeqq_n_s16:
2220 case ARM::BI__builtin_arm_mve_vcmpeqq_n_s32:
2221 case ARM::BI__builtin_arm_mve_vcmpeqq_n_s8:
2222 case ARM::BI__builtin_arm_mve_vcmpeqq_n_u16:
2223 case ARM::BI__builtin_arm_mve_vcmpeqq_n_u32:
2224 case ARM::BI__builtin_arm_mve_vcmpeqq_n_u8: {
2225 llvm::Type * Param0;
2226 switch (BuiltinID) {
2227 case ARM::BI__builtin_arm_mve_vcmpeqq_n_s16:
2228 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2229 break;
2230 case ARM::BI__builtin_arm_mve_vcmpeqq_n_s32:
2231 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2232 break;
2233 case ARM::BI__builtin_arm_mve_vcmpeqq_n_s8:
2234 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2235 break;
2236 case ARM::BI__builtin_arm_mve_vcmpeqq_n_u16:
2237 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2238 break;
2239 case ARM::BI__builtin_arm_mve_vcmpeqq_n_u32:
2240 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2241 break;
2242 case ARM::BI__builtin_arm_mve_vcmpeqq_n_u8:
2243 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2244 break;
2245 }
2246 Value *Val0 = EmitScalarExpr(E->getArg(0));
2247 Value *Val1 = EmitScalarExpr(E->getArg(1));
2248 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2249 Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
2250 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2251 return Builder.CreateIntCast(Val4, Int16Ty, false);
2252 }
2253 case ARM::BI__builtin_arm_mve_vcmpneq_n_s16:
2254 case ARM::BI__builtin_arm_mve_vcmpneq_n_s32:
2255 case ARM::BI__builtin_arm_mve_vcmpneq_n_s8:
2256 case ARM::BI__builtin_arm_mve_vcmpneq_n_u16:
2257 case ARM::BI__builtin_arm_mve_vcmpneq_n_u32:
2258 case ARM::BI__builtin_arm_mve_vcmpneq_n_u8: {
2259 llvm::Type * Param0;
2260 switch (BuiltinID) {
2261 case ARM::BI__builtin_arm_mve_vcmpneq_n_s16:
2262 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2263 break;
2264 case ARM::BI__builtin_arm_mve_vcmpneq_n_s32:
2265 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2266 break;
2267 case ARM::BI__builtin_arm_mve_vcmpneq_n_s8:
2268 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2269 break;
2270 case ARM::BI__builtin_arm_mve_vcmpneq_n_u16:
2271 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2272 break;
2273 case ARM::BI__builtin_arm_mve_vcmpneq_n_u32:
2274 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2275 break;
2276 case ARM::BI__builtin_arm_mve_vcmpneq_n_u8:
2277 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2278 break;
2279 }
2280 Value *Val0 = EmitScalarExpr(E->getArg(0));
2281 Value *Val1 = EmitScalarExpr(E->getArg(1));
2282 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2283 Value *Val3 = Builder.CreateICmpNE(Val0, Val2);
2284 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2285 return Builder.CreateIntCast(Val4, Int16Ty, false);
2286 }
2287 case ARM::BI__builtin_arm_mve_vcmpgeq_n_s16:
2288 case ARM::BI__builtin_arm_mve_vcmpgeq_n_s32:
2289 case ARM::BI__builtin_arm_mve_vcmpgeq_n_s8: {
2290 llvm::Type * Param0;
2291 switch (BuiltinID) {
2292 case ARM::BI__builtin_arm_mve_vcmpgeq_n_s16:
2293 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2294 break;
2295 case ARM::BI__builtin_arm_mve_vcmpgeq_n_s32:
2296 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2297 break;
2298 case ARM::BI__builtin_arm_mve_vcmpgeq_n_s8:
2299 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2300 break;
2301 }
2302 Value *Val0 = EmitScalarExpr(E->getArg(0));
2303 Value *Val1 = EmitScalarExpr(E->getArg(1));
2304 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2305 Value *Val3 = Builder.CreateICmpSGE(Val0, Val2);
2306 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2307 return Builder.CreateIntCast(Val4, Int16Ty, false);
2308 }
2309 case ARM::BI__builtin_arm_mve_vcmpgtq_n_s16:
2310 case ARM::BI__builtin_arm_mve_vcmpgtq_n_s32:
2311 case ARM::BI__builtin_arm_mve_vcmpgtq_n_s8: {
2312 llvm::Type * Param0;
2313 switch (BuiltinID) {
2314 case ARM::BI__builtin_arm_mve_vcmpgtq_n_s16:
2315 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2316 break;
2317 case ARM::BI__builtin_arm_mve_vcmpgtq_n_s32:
2318 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2319 break;
2320 case ARM::BI__builtin_arm_mve_vcmpgtq_n_s8:
2321 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2322 break;
2323 }
2324 Value *Val0 = EmitScalarExpr(E->getArg(0));
2325 Value *Val1 = EmitScalarExpr(E->getArg(1));
2326 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2327 Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
2328 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2329 return Builder.CreateIntCast(Val4, Int16Ty, false);
2330 }
2331 case ARM::BI__builtin_arm_mve_vcmpleq_n_s16:
2332 case ARM::BI__builtin_arm_mve_vcmpleq_n_s32:
2333 case ARM::BI__builtin_arm_mve_vcmpleq_n_s8: {
2334 llvm::Type * Param0;
2335 switch (BuiltinID) {
2336 case ARM::BI__builtin_arm_mve_vcmpleq_n_s16:
2337 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2338 break;
2339 case ARM::BI__builtin_arm_mve_vcmpleq_n_s32:
2340 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2341 break;
2342 case ARM::BI__builtin_arm_mve_vcmpleq_n_s8:
2343 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2344 break;
2345 }
2346 Value *Val0 = EmitScalarExpr(E->getArg(0));
2347 Value *Val1 = EmitScalarExpr(E->getArg(1));
2348 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2349 Value *Val3 = Builder.CreateICmpSLE(Val0, Val2);
2350 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2351 return Builder.CreateIntCast(Val4, Int16Ty, false);
2352 }
2353 case ARM::BI__builtin_arm_mve_vcmpltq_n_s16:
2354 case ARM::BI__builtin_arm_mve_vcmpltq_n_s32:
2355 case ARM::BI__builtin_arm_mve_vcmpltq_n_s8: {
2356 llvm::Type * Param0;
2357 switch (BuiltinID) {
2358 case ARM::BI__builtin_arm_mve_vcmpltq_n_s16:
2359 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2360 break;
2361 case ARM::BI__builtin_arm_mve_vcmpltq_n_s32:
2362 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2363 break;
2364 case ARM::BI__builtin_arm_mve_vcmpltq_n_s8:
2365 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2366 break;
2367 }
2368 Value *Val0 = EmitScalarExpr(E->getArg(0));
2369 Value *Val1 = EmitScalarExpr(E->getArg(1));
2370 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2371 Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
2372 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2373 return Builder.CreateIntCast(Val4, Int16Ty, false);
2374 }
2375 case ARM::BI__builtin_arm_mve_vcmpcsq_n_u16:
2376 case ARM::BI__builtin_arm_mve_vcmpcsq_n_u32:
2377 case ARM::BI__builtin_arm_mve_vcmpcsq_n_u8: {
2378 llvm::Type * Param0;
2379 switch (BuiltinID) {
2380 case ARM::BI__builtin_arm_mve_vcmpcsq_n_u16:
2381 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2382 break;
2383 case ARM::BI__builtin_arm_mve_vcmpcsq_n_u32:
2384 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2385 break;
2386 case ARM::BI__builtin_arm_mve_vcmpcsq_n_u8:
2387 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2388 break;
2389 }
2390 Value *Val0 = EmitScalarExpr(E->getArg(0));
2391 Value *Val1 = EmitScalarExpr(E->getArg(1));
2392 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2393 Value *Val3 = Builder.CreateICmpUGE(Val0, Val2);
2394 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2395 return Builder.CreateIntCast(Val4, Int16Ty, false);
2396 }
2397 case ARM::BI__builtin_arm_mve_vcmphiq_n_u16:
2398 case ARM::BI__builtin_arm_mve_vcmphiq_n_u32:
2399 case ARM::BI__builtin_arm_mve_vcmphiq_n_u8: {
2400 llvm::Type * Param0;
2401 switch (BuiltinID) {
2402 case ARM::BI__builtin_arm_mve_vcmphiq_n_u16:
2403 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2404 break;
2405 case ARM::BI__builtin_arm_mve_vcmphiq_n_u32:
2406 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2407 break;
2408 case ARM::BI__builtin_arm_mve_vcmphiq_n_u8:
2409 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2410 break;
2411 }
2412 Value *Val0 = EmitScalarExpr(E->getArg(0));
2413 Value *Val1 = EmitScalarExpr(E->getArg(1));
2414 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2415 Value *Val3 = Builder.CreateICmpUGT(Val0, Val2);
2416 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val3});
2417 return Builder.CreateIntCast(Val4, Int16Ty, false);
2418 }
2419 case ARM::BI__builtin_arm_mve_vqdmullbq_n_s16:
2420 case ARM::BI__builtin_arm_mve_vqdmullbq_n_s32:
2421 case ARM::BI__builtin_arm_mve_vqdmulltq_n_s16:
2422 case ARM::BI__builtin_arm_mve_vqdmulltq_n_s32: {
2423 uint32_t Param0;
2424 llvm::Type * Param1;
2425 llvm::Type * Param2;
2426 switch (BuiltinID) {
2427 case ARM::BI__builtin_arm_mve_vqdmullbq_n_s16:
2428 Param0 = 0;
2429 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2430 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2431 break;
2432 case ARM::BI__builtin_arm_mve_vqdmullbq_n_s32:
2433 Param0 = 0;
2434 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
2435 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2436 break;
2437 case ARM::BI__builtin_arm_mve_vqdmulltq_n_s16:
2438 Param0 = 1;
2439 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2440 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2441 break;
2442 case ARM::BI__builtin_arm_mve_vqdmulltq_n_s32:
2443 Param0 = 1;
2444 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
2445 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2446 break;
2447 }
2448 Value *Val0 = EmitScalarExpr(E->getArg(0));
2449 Value *Val1 = EmitScalarExpr(E->getArg(1));
2450 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2451 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
2452 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmull, {Param1, Param2}), {Val0, Val2, Val3});
2453 }
2454 case ARM::BI__builtin_arm_mve_vhaddq_n_s16:
2455 case ARM::BI__builtin_arm_mve_vhaddq_n_s32:
2456 case ARM::BI__builtin_arm_mve_vhaddq_n_s8:
2457 case ARM::BI__builtin_arm_mve_vhaddq_n_u16:
2458 case ARM::BI__builtin_arm_mve_vhaddq_n_u32:
2459 case ARM::BI__builtin_arm_mve_vhaddq_n_u8:
2460 case ARM::BI__builtin_arm_mve_vhsubq_n_s16:
2461 case ARM::BI__builtin_arm_mve_vhsubq_n_s32:
2462 case ARM::BI__builtin_arm_mve_vhsubq_n_s8:
2463 case ARM::BI__builtin_arm_mve_vhsubq_n_u16:
2464 case ARM::BI__builtin_arm_mve_vhsubq_n_u32:
2465 case ARM::BI__builtin_arm_mve_vhsubq_n_u8: {
2466 uint32_t Param0;
2467 Intrinsic::ID Param1;
2468 llvm::Type * Param2;
2469 switch (BuiltinID) {
2470 case ARM::BI__builtin_arm_mve_vhaddq_n_s16:
2471 Param0 = 0;
2472 Param1 = Intrinsic::arm_mve_vhadd;
2473 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2474 break;
2475 case ARM::BI__builtin_arm_mve_vhaddq_n_s32:
2476 Param0 = 0;
2477 Param1 = Intrinsic::arm_mve_vhadd;
2478 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2479 break;
2480 case ARM::BI__builtin_arm_mve_vhaddq_n_s8:
2481 Param0 = 0;
2482 Param1 = Intrinsic::arm_mve_vhadd;
2483 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
2484 break;
2485 case ARM::BI__builtin_arm_mve_vhaddq_n_u16:
2486 Param0 = 1;
2487 Param1 = Intrinsic::arm_mve_vhadd;
2488 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2489 break;
2490 case ARM::BI__builtin_arm_mve_vhaddq_n_u32:
2491 Param0 = 1;
2492 Param1 = Intrinsic::arm_mve_vhadd;
2493 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2494 break;
2495 case ARM::BI__builtin_arm_mve_vhaddq_n_u8:
2496 Param0 = 1;
2497 Param1 = Intrinsic::arm_mve_vhadd;
2498 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
2499 break;
2500 case ARM::BI__builtin_arm_mve_vhsubq_n_s16:
2501 Param0 = 0;
2502 Param1 = Intrinsic::arm_mve_vhsub;
2503 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2504 break;
2505 case ARM::BI__builtin_arm_mve_vhsubq_n_s32:
2506 Param0 = 0;
2507 Param1 = Intrinsic::arm_mve_vhsub;
2508 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2509 break;
2510 case ARM::BI__builtin_arm_mve_vhsubq_n_s8:
2511 Param0 = 0;
2512 Param1 = Intrinsic::arm_mve_vhsub;
2513 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
2514 break;
2515 case ARM::BI__builtin_arm_mve_vhsubq_n_u16:
2516 Param0 = 1;
2517 Param1 = Intrinsic::arm_mve_vhsub;
2518 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
2519 break;
2520 case ARM::BI__builtin_arm_mve_vhsubq_n_u32:
2521 Param0 = 1;
2522 Param1 = Intrinsic::arm_mve_vhsub;
2523 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
2524 break;
2525 case ARM::BI__builtin_arm_mve_vhsubq_n_u8:
2526 Param0 = 1;
2527 Param1 = Intrinsic::arm_mve_vhsub;
2528 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
2529 break;
2530 }
2531 Value *Val0 = EmitScalarExpr(E->getArg(0));
2532 Value *Val1 = EmitScalarExpr(E->getArg(1));
2533 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2534 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
2535 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val2, Val3});
2536 }
2537 case ARM::BI__builtin_arm_mve_vaddq_n_s16:
2538 case ARM::BI__builtin_arm_mve_vaddq_n_s32:
2539 case ARM::BI__builtin_arm_mve_vaddq_n_s8:
2540 case ARM::BI__builtin_arm_mve_vaddq_n_u16:
2541 case ARM::BI__builtin_arm_mve_vaddq_n_u32:
2542 case ARM::BI__builtin_arm_mve_vaddq_n_u8: {
2543 Value *Val0 = EmitScalarExpr(E->getArg(0));
2544 Value *Val1 = EmitScalarExpr(E->getArg(1));
2545 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2546 return Builder.CreateAdd(Val0, Val2);
2547 }
2548 case ARM::BI__builtin_arm_mve_vqaddq_n_s16:
2549 case ARM::BI__builtin_arm_mve_vqaddq_n_s32:
2550 case ARM::BI__builtin_arm_mve_vqaddq_n_s8:
2551 case ARM::BI__builtin_arm_mve_vqaddq_n_u16:
2552 case ARM::BI__builtin_arm_mve_vqaddq_n_u32:
2553 case ARM::BI__builtin_arm_mve_vqaddq_n_u8:
2554 case ARM::BI__builtin_arm_mve_vqdmulhq_n_s16:
2555 case ARM::BI__builtin_arm_mve_vqdmulhq_n_s32:
2556 case ARM::BI__builtin_arm_mve_vqdmulhq_n_s8:
2557 case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s16:
2558 case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s32:
2559 case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s8:
2560 case ARM::BI__builtin_arm_mve_vqsubq_n_s16:
2561 case ARM::BI__builtin_arm_mve_vqsubq_n_s32:
2562 case ARM::BI__builtin_arm_mve_vqsubq_n_s8:
2563 case ARM::BI__builtin_arm_mve_vqsubq_n_u16:
2564 case ARM::BI__builtin_arm_mve_vqsubq_n_u32:
2565 case ARM::BI__builtin_arm_mve_vqsubq_n_u8: {
2566 Intrinsic::ID Param0;
2567 llvm::Type * Param1;
2568 switch (BuiltinID) {
2569 case ARM::BI__builtin_arm_mve_vqaddq_n_s16:
2570 Param0 = Intrinsic::sadd_sat;
2571 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2572 break;
2573 case ARM::BI__builtin_arm_mve_vqaddq_n_s32:
2574 Param0 = Intrinsic::sadd_sat;
2575 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2576 break;
2577 case ARM::BI__builtin_arm_mve_vqaddq_n_s8:
2578 Param0 = Intrinsic::sadd_sat;
2579 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2580 break;
2581 case ARM::BI__builtin_arm_mve_vqaddq_n_u16:
2582 Param0 = Intrinsic::uadd_sat;
2583 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2584 break;
2585 case ARM::BI__builtin_arm_mve_vqaddq_n_u32:
2586 Param0 = Intrinsic::uadd_sat;
2587 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2588 break;
2589 case ARM::BI__builtin_arm_mve_vqaddq_n_u8:
2590 Param0 = Intrinsic::uadd_sat;
2591 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2592 break;
2593 case ARM::BI__builtin_arm_mve_vqdmulhq_n_s16:
2594 Param0 = Intrinsic::arm_mve_vqdmulh;
2595 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2596 break;
2597 case ARM::BI__builtin_arm_mve_vqdmulhq_n_s32:
2598 Param0 = Intrinsic::arm_mve_vqdmulh;
2599 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2600 break;
2601 case ARM::BI__builtin_arm_mve_vqdmulhq_n_s8:
2602 Param0 = Intrinsic::arm_mve_vqdmulh;
2603 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2604 break;
2605 case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s16:
2606 Param0 = Intrinsic::arm_mve_vqrdmulh;
2607 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2608 break;
2609 case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s32:
2610 Param0 = Intrinsic::arm_mve_vqrdmulh;
2611 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2612 break;
2613 case ARM::BI__builtin_arm_mve_vqrdmulhq_n_s8:
2614 Param0 = Intrinsic::arm_mve_vqrdmulh;
2615 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2616 break;
2617 case ARM::BI__builtin_arm_mve_vqsubq_n_s16:
2618 Param0 = Intrinsic::ssub_sat;
2619 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2620 break;
2621 case ARM::BI__builtin_arm_mve_vqsubq_n_s32:
2622 Param0 = Intrinsic::ssub_sat;
2623 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2624 break;
2625 case ARM::BI__builtin_arm_mve_vqsubq_n_s8:
2626 Param0 = Intrinsic::ssub_sat;
2627 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2628 break;
2629 case ARM::BI__builtin_arm_mve_vqsubq_n_u16:
2630 Param0 = Intrinsic::usub_sat;
2631 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2632 break;
2633 case ARM::BI__builtin_arm_mve_vqsubq_n_u32:
2634 Param0 = Intrinsic::usub_sat;
2635 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2636 break;
2637 case ARM::BI__builtin_arm_mve_vqsubq_n_u8:
2638 Param0 = Intrinsic::usub_sat;
2639 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2640 break;
2641 }
2642 Value *Val0 = EmitScalarExpr(E->getArg(0));
2643 Value *Val1 = EmitScalarExpr(E->getArg(1));
2644 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2645 return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val2});
2646 }
2647 case ARM::BI__builtin_arm_mve_vaddq_n_f16:
2648 case ARM::BI__builtin_arm_mve_vaddq_n_f32: {
2649 Value *Val0 = EmitScalarExpr(E->getArg(0));
2650 Value *Val1 = EmitScalarExpr(E->getArg(1));
2651 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2652 return Builder.CreateFAdd(Val0, Val2);
2653 }
2654 case ARM::BI__builtin_arm_mve_vmulq_n_f16:
2655 case ARM::BI__builtin_arm_mve_vmulq_n_f32: {
2656 Value *Val0 = EmitScalarExpr(E->getArg(0));
2657 Value *Val1 = EmitScalarExpr(E->getArg(1));
2658 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2659 return Builder.CreateFMul(Val0, Val2);
2660 }
2661 case ARM::BI__builtin_arm_mve_vsubq_n_f16:
2662 case ARM::BI__builtin_arm_mve_vsubq_n_f32: {
2663 Value *Val0 = EmitScalarExpr(E->getArg(0));
2664 Value *Val1 = EmitScalarExpr(E->getArg(1));
2665 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2666 return Builder.CreateFSub(Val0, Val2);
2667 }
2668 case ARM::BI__builtin_arm_mve_vmulq_n_s16:
2669 case ARM::BI__builtin_arm_mve_vmulq_n_s32:
2670 case ARM::BI__builtin_arm_mve_vmulq_n_s8:
2671 case ARM::BI__builtin_arm_mve_vmulq_n_u16:
2672 case ARM::BI__builtin_arm_mve_vmulq_n_u32:
2673 case ARM::BI__builtin_arm_mve_vmulq_n_u8: {
2674 Value *Val0 = EmitScalarExpr(E->getArg(0));
2675 Value *Val1 = EmitScalarExpr(E->getArg(1));
2676 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2677 return Builder.CreateMul(Val0, Val2);
2678 }
2679 case ARM::BI__builtin_arm_mve_vsubq_n_s16:
2680 case ARM::BI__builtin_arm_mve_vsubq_n_s32:
2681 case ARM::BI__builtin_arm_mve_vsubq_n_s8:
2682 case ARM::BI__builtin_arm_mve_vsubq_n_u16:
2683 case ARM::BI__builtin_arm_mve_vsubq_n_u32:
2684 case ARM::BI__builtin_arm_mve_vsubq_n_u8: {
2685 Value *Val0 = EmitScalarExpr(E->getArg(0));
2686 Value *Val1 = EmitScalarExpr(E->getArg(1));
2687 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
2688 return Builder.CreateSub(Val0, Val2);
2689 }
2690 case ARM::BI__builtin_arm_mve_vmaxnmavq_f16:
2691 case ARM::BI__builtin_arm_mve_vmaxnmavq_f32:
2692 case ARM::BI__builtin_arm_mve_vmaxnmvq_f16:
2693 case ARM::BI__builtin_arm_mve_vmaxnmvq_f32:
2694 case ARM::BI__builtin_arm_mve_vminnmavq_f16:
2695 case ARM::BI__builtin_arm_mve_vminnmavq_f32:
2696 case ARM::BI__builtin_arm_mve_vminnmvq_f16:
2697 case ARM::BI__builtin_arm_mve_vminnmvq_f32: {
2698 Intrinsic::ID Param0;
2699 llvm::Type * Param1;
2700 llvm::Type * Param2;
2701 switch (BuiltinID) {
2702 case ARM::BI__builtin_arm_mve_vmaxnmavq_f16:
2703 Param0 = Intrinsic::arm_mve_maxnmav;
2704 Param1 = HalfTy;
2705 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
2706 break;
2707 case ARM::BI__builtin_arm_mve_vmaxnmavq_f32:
2708 Param0 = Intrinsic::arm_mve_maxnmav;
2709 Param1 = FloatTy;
2710 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
2711 break;
2712 case ARM::BI__builtin_arm_mve_vmaxnmvq_f16:
2713 Param0 = Intrinsic::arm_mve_maxnmv;
2714 Param1 = HalfTy;
2715 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
2716 break;
2717 case ARM::BI__builtin_arm_mve_vmaxnmvq_f32:
2718 Param0 = Intrinsic::arm_mve_maxnmv;
2719 Param1 = FloatTy;
2720 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
2721 break;
2722 case ARM::BI__builtin_arm_mve_vminnmavq_f16:
2723 Param0 = Intrinsic::arm_mve_minnmav;
2724 Param1 = HalfTy;
2725 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
2726 break;
2727 case ARM::BI__builtin_arm_mve_vminnmavq_f32:
2728 Param0 = Intrinsic::arm_mve_minnmav;
2729 Param1 = FloatTy;
2730 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
2731 break;
2732 case ARM::BI__builtin_arm_mve_vminnmvq_f16:
2733 Param0 = Intrinsic::arm_mve_minnmv;
2734 Param1 = HalfTy;
2735 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
2736 break;
2737 case ARM::BI__builtin_arm_mve_vminnmvq_f32:
2738 Param0 = Intrinsic::arm_mve_minnmv;
2739 Param1 = FloatTy;
2740 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
2741 break;
2742 }
2743 Value *Val0 = EmitScalarExpr(E->getArg(0));
2744 Value *Val1 = EmitScalarExpr(E->getArg(1));
2745 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1, Param2}), {Val0, Val1});
2746 return (Val2);
2747 }
2748 case ARM::BI__builtin_arm_mve_vddupq_n_u16:
2749 case ARM::BI__builtin_arm_mve_vddupq_n_u32:
2750 case ARM::BI__builtin_arm_mve_vddupq_n_u8:
2751 case ARM::BI__builtin_arm_mve_vidupq_n_u16:
2752 case ARM::BI__builtin_arm_mve_vidupq_n_u32:
2753 case ARM::BI__builtin_arm_mve_vidupq_n_u8: {
2754 Intrinsic::ID Param0;
2755 llvm::Type * Param1;
2756 switch (BuiltinID) {
2757 case ARM::BI__builtin_arm_mve_vddupq_n_u16:
2758 Param0 = Intrinsic::arm_mve_vddup;
2759 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2760 break;
2761 case ARM::BI__builtin_arm_mve_vddupq_n_u32:
2762 Param0 = Intrinsic::arm_mve_vddup;
2763 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2764 break;
2765 case ARM::BI__builtin_arm_mve_vddupq_n_u8:
2766 Param0 = Intrinsic::arm_mve_vddup;
2767 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2768 break;
2769 case ARM::BI__builtin_arm_mve_vidupq_n_u16:
2770 Param0 = Intrinsic::arm_mve_vidup;
2771 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
2772 break;
2773 case ARM::BI__builtin_arm_mve_vidupq_n_u32:
2774 Param0 = Intrinsic::arm_mve_vidup;
2775 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
2776 break;
2777 case ARM::BI__builtin_arm_mve_vidupq_n_u8:
2778 Param0 = Intrinsic::arm_mve_vidup;
2779 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
2780 break;
2781 }
2782 Value *Val0 = EmitScalarExpr(E->getArg(0));
2783 Value *Val1 = EmitScalarExpr(E->getArg(1));
2784 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1});
2785 return Builder.CreateExtractValue(Val2, static_cast<unsigned>(0));
2786 }
2787 case ARM::BI__builtin_arm_mve_vmaxavq_s32:
2788 case ARM::BI__builtin_arm_mve_vminavq_s32: {
2789 Intrinsic::ID Param0;
2790 switch (BuiltinID) {
2791 case ARM::BI__builtin_arm_mve_vmaxavq_s32:
2792 Param0 = Intrinsic::arm_mve_maxav;
2793 break;
2794 case ARM::BI__builtin_arm_mve_vminavq_s32:
2795 Param0 = Intrinsic::arm_mve_minav;
2796 break;
2797 }
2798 Value *Val0 = EmitScalarExpr(E->getArg(0));
2799 Value *Val1 = EmitScalarExpr(E->getArg(1));
2800 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1});
2801 return Builder.CreateIntCast(Val2, Int32Ty, false);
2802 }
2803 case ARM::BI__builtin_arm_mve_vcmpeqq_f16:
2804 case ARM::BI__builtin_arm_mve_vcmpeqq_f32: {
2805 llvm::Type * Param0;
2806 switch (BuiltinID) {
2807 case ARM::BI__builtin_arm_mve_vcmpeqq_f16:
2808 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2809 break;
2810 case ARM::BI__builtin_arm_mve_vcmpeqq_f32:
2811 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2812 break;
2813 }
2814 Value *Val0 = EmitScalarExpr(E->getArg(0));
2815 Value *Val1 = EmitScalarExpr(E->getArg(1));
2816 Value *Val2 = Builder.CreateFCmpOEQ(Val0, Val1);
2817 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2818 return Builder.CreateIntCast(Val3, Int16Ty, false);
2819 }
2820 case ARM::BI__builtin_arm_mve_vcmpgeq_f16:
2821 case ARM::BI__builtin_arm_mve_vcmpgeq_f32: {
2822 llvm::Type * Param0;
2823 switch (BuiltinID) {
2824 case ARM::BI__builtin_arm_mve_vcmpgeq_f16:
2825 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2826 break;
2827 case ARM::BI__builtin_arm_mve_vcmpgeq_f32:
2828 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2829 break;
2830 }
2831 Value *Val0 = EmitScalarExpr(E->getArg(0));
2832 Value *Val1 = EmitScalarExpr(E->getArg(1));
2833 Value *Val2 = Builder.CreateFCmpOGE(Val0, Val1);
2834 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2835 return Builder.CreateIntCast(Val3, Int16Ty, false);
2836 }
2837 case ARM::BI__builtin_arm_mve_vcmpgtq_f16:
2838 case ARM::BI__builtin_arm_mve_vcmpgtq_f32: {
2839 llvm::Type * Param0;
2840 switch (BuiltinID) {
2841 case ARM::BI__builtin_arm_mve_vcmpgtq_f16:
2842 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2843 break;
2844 case ARM::BI__builtin_arm_mve_vcmpgtq_f32:
2845 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2846 break;
2847 }
2848 Value *Val0 = EmitScalarExpr(E->getArg(0));
2849 Value *Val1 = EmitScalarExpr(E->getArg(1));
2850 Value *Val2 = Builder.CreateFCmpOGT(Val0, Val1);
2851 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2852 return Builder.CreateIntCast(Val3, Int16Ty, false);
2853 }
2854 case ARM::BI__builtin_arm_mve_vcmpleq_f16:
2855 case ARM::BI__builtin_arm_mve_vcmpleq_f32: {
2856 llvm::Type * Param0;
2857 switch (BuiltinID) {
2858 case ARM::BI__builtin_arm_mve_vcmpleq_f16:
2859 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2860 break;
2861 case ARM::BI__builtin_arm_mve_vcmpleq_f32:
2862 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2863 break;
2864 }
2865 Value *Val0 = EmitScalarExpr(E->getArg(0));
2866 Value *Val1 = EmitScalarExpr(E->getArg(1));
2867 Value *Val2 = Builder.CreateFCmpULE(Val0, Val1);
2868 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2869 return Builder.CreateIntCast(Val3, Int16Ty, false);
2870 }
2871 case ARM::BI__builtin_arm_mve_vcmpltq_f16:
2872 case ARM::BI__builtin_arm_mve_vcmpltq_f32: {
2873 llvm::Type * Param0;
2874 switch (BuiltinID) {
2875 case ARM::BI__builtin_arm_mve_vcmpltq_f16:
2876 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2877 break;
2878 case ARM::BI__builtin_arm_mve_vcmpltq_f32:
2879 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2880 break;
2881 }
2882 Value *Val0 = EmitScalarExpr(E->getArg(0));
2883 Value *Val1 = EmitScalarExpr(E->getArg(1));
2884 Value *Val2 = Builder.CreateFCmpULT(Val0, Val1);
2885 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2886 return Builder.CreateIntCast(Val3, Int16Ty, false);
2887 }
2888 case ARM::BI__builtin_arm_mve_vcmpneq_f16:
2889 case ARM::BI__builtin_arm_mve_vcmpneq_f32: {
2890 llvm::Type * Param0;
2891 switch (BuiltinID) {
2892 case ARM::BI__builtin_arm_mve_vcmpneq_f16:
2893 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2894 break;
2895 case ARM::BI__builtin_arm_mve_vcmpneq_f32:
2896 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2897 break;
2898 }
2899 Value *Val0 = EmitScalarExpr(E->getArg(0));
2900 Value *Val1 = EmitScalarExpr(E->getArg(1));
2901 Value *Val2 = Builder.CreateFCmpUNE(Val0, Val1);
2902 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2903 return Builder.CreateIntCast(Val3, Int16Ty, false);
2904 }
2905 case ARM::BI__builtin_arm_mve_vcmpeqq_s16:
2906 case ARM::BI__builtin_arm_mve_vcmpeqq_s32:
2907 case ARM::BI__builtin_arm_mve_vcmpeqq_s8:
2908 case ARM::BI__builtin_arm_mve_vcmpeqq_u16:
2909 case ARM::BI__builtin_arm_mve_vcmpeqq_u32:
2910 case ARM::BI__builtin_arm_mve_vcmpeqq_u8: {
2911 llvm::Type * Param0;
2912 switch (BuiltinID) {
2913 case ARM::BI__builtin_arm_mve_vcmpeqq_s16:
2914 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2915 break;
2916 case ARM::BI__builtin_arm_mve_vcmpeqq_s32:
2917 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2918 break;
2919 case ARM::BI__builtin_arm_mve_vcmpeqq_s8:
2920 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2921 break;
2922 case ARM::BI__builtin_arm_mve_vcmpeqq_u16:
2923 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2924 break;
2925 case ARM::BI__builtin_arm_mve_vcmpeqq_u32:
2926 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2927 break;
2928 case ARM::BI__builtin_arm_mve_vcmpeqq_u8:
2929 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2930 break;
2931 }
2932 Value *Val0 = EmitScalarExpr(E->getArg(0));
2933 Value *Val1 = EmitScalarExpr(E->getArg(1));
2934 Value *Val2 = Builder.CreateICmpEQ(Val0, Val1);
2935 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2936 return Builder.CreateIntCast(Val3, Int16Ty, false);
2937 }
2938 case ARM::BI__builtin_arm_mve_vcmpneq_s16:
2939 case ARM::BI__builtin_arm_mve_vcmpneq_s32:
2940 case ARM::BI__builtin_arm_mve_vcmpneq_s8:
2941 case ARM::BI__builtin_arm_mve_vcmpneq_u16:
2942 case ARM::BI__builtin_arm_mve_vcmpneq_u32:
2943 case ARM::BI__builtin_arm_mve_vcmpneq_u8: {
2944 llvm::Type * Param0;
2945 switch (BuiltinID) {
2946 case ARM::BI__builtin_arm_mve_vcmpneq_s16:
2947 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2948 break;
2949 case ARM::BI__builtin_arm_mve_vcmpneq_s32:
2950 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2951 break;
2952 case ARM::BI__builtin_arm_mve_vcmpneq_s8:
2953 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2954 break;
2955 case ARM::BI__builtin_arm_mve_vcmpneq_u16:
2956 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2957 break;
2958 case ARM::BI__builtin_arm_mve_vcmpneq_u32:
2959 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2960 break;
2961 case ARM::BI__builtin_arm_mve_vcmpneq_u8:
2962 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2963 break;
2964 }
2965 Value *Val0 = EmitScalarExpr(E->getArg(0));
2966 Value *Val1 = EmitScalarExpr(E->getArg(1));
2967 Value *Val2 = Builder.CreateICmpNE(Val0, Val1);
2968 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2969 return Builder.CreateIntCast(Val3, Int16Ty, false);
2970 }
2971 case ARM::BI__builtin_arm_mve_vcmpgeq_s16:
2972 case ARM::BI__builtin_arm_mve_vcmpgeq_s32:
2973 case ARM::BI__builtin_arm_mve_vcmpgeq_s8: {
2974 llvm::Type * Param0;
2975 switch (BuiltinID) {
2976 case ARM::BI__builtin_arm_mve_vcmpgeq_s16:
2977 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
2978 break;
2979 case ARM::BI__builtin_arm_mve_vcmpgeq_s32:
2980 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
2981 break;
2982 case ARM::BI__builtin_arm_mve_vcmpgeq_s8:
2983 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
2984 break;
2985 }
2986 Value *Val0 = EmitScalarExpr(E->getArg(0));
2987 Value *Val1 = EmitScalarExpr(E->getArg(1));
2988 Value *Val2 = Builder.CreateICmpSGE(Val0, Val1);
2989 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
2990 return Builder.CreateIntCast(Val3, Int16Ty, false);
2991 }
2992 case ARM::BI__builtin_arm_mve_vmaxq_s16:
2993 case ARM::BI__builtin_arm_mve_vmaxq_s32:
2994 case ARM::BI__builtin_arm_mve_vmaxq_s8: {
2995 Value *Val0 = EmitScalarExpr(E->getArg(0));
2996 Value *Val1 = EmitScalarExpr(E->getArg(1));
2997 Value *Val2 = Builder.CreateICmpSGE(Val0, Val1);
2998 return Builder.CreateSelect(Val2, Val0, Val1);
2999 }
3000 case ARM::BI__builtin_arm_mve_vcmpgtq_s16:
3001 case ARM::BI__builtin_arm_mve_vcmpgtq_s32:
3002 case ARM::BI__builtin_arm_mve_vcmpgtq_s8: {
3003 llvm::Type * Param0;
3004 switch (BuiltinID) {
3005 case ARM::BI__builtin_arm_mve_vcmpgtq_s16:
3006 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3007 break;
3008 case ARM::BI__builtin_arm_mve_vcmpgtq_s32:
3009 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3010 break;
3011 case ARM::BI__builtin_arm_mve_vcmpgtq_s8:
3012 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3013 break;
3014 }
3015 Value *Val0 = EmitScalarExpr(E->getArg(0));
3016 Value *Val1 = EmitScalarExpr(E->getArg(1));
3017 Value *Val2 = Builder.CreateICmpSGT(Val0, Val1);
3018 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
3019 return Builder.CreateIntCast(Val3, Int16Ty, false);
3020 }
3021 case ARM::BI__builtin_arm_mve_vcmpleq_s16:
3022 case ARM::BI__builtin_arm_mve_vcmpleq_s32:
3023 case ARM::BI__builtin_arm_mve_vcmpleq_s8: {
3024 llvm::Type * Param0;
3025 switch (BuiltinID) {
3026 case ARM::BI__builtin_arm_mve_vcmpleq_s16:
3027 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3028 break;
3029 case ARM::BI__builtin_arm_mve_vcmpleq_s32:
3030 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3031 break;
3032 case ARM::BI__builtin_arm_mve_vcmpleq_s8:
3033 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3034 break;
3035 }
3036 Value *Val0 = EmitScalarExpr(E->getArg(0));
3037 Value *Val1 = EmitScalarExpr(E->getArg(1));
3038 Value *Val2 = Builder.CreateICmpSLE(Val0, Val1);
3039 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
3040 return Builder.CreateIntCast(Val3, Int16Ty, false);
3041 }
3042 case ARM::BI__builtin_arm_mve_vminq_s16:
3043 case ARM::BI__builtin_arm_mve_vminq_s32:
3044 case ARM::BI__builtin_arm_mve_vminq_s8: {
3045 Value *Val0 = EmitScalarExpr(E->getArg(0));
3046 Value *Val1 = EmitScalarExpr(E->getArg(1));
3047 Value *Val2 = Builder.CreateICmpSLE(Val0, Val1);
3048 return Builder.CreateSelect(Val2, Val0, Val1);
3049 }
3050 case ARM::BI__builtin_arm_mve_vcmpltq_s16:
3051 case ARM::BI__builtin_arm_mve_vcmpltq_s32:
3052 case ARM::BI__builtin_arm_mve_vcmpltq_s8: {
3053 llvm::Type * Param0;
3054 switch (BuiltinID) {
3055 case ARM::BI__builtin_arm_mve_vcmpltq_s16:
3056 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3057 break;
3058 case ARM::BI__builtin_arm_mve_vcmpltq_s32:
3059 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3060 break;
3061 case ARM::BI__builtin_arm_mve_vcmpltq_s8:
3062 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3063 break;
3064 }
3065 Value *Val0 = EmitScalarExpr(E->getArg(0));
3066 Value *Val1 = EmitScalarExpr(E->getArg(1));
3067 Value *Val2 = Builder.CreateICmpSLT(Val0, Val1);
3068 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
3069 return Builder.CreateIntCast(Val3, Int16Ty, false);
3070 }
3071 case ARM::BI__builtin_arm_mve_vcmpcsq_u16:
3072 case ARM::BI__builtin_arm_mve_vcmpcsq_u32:
3073 case ARM::BI__builtin_arm_mve_vcmpcsq_u8: {
3074 llvm::Type * Param0;
3075 switch (BuiltinID) {
3076 case ARM::BI__builtin_arm_mve_vcmpcsq_u16:
3077 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3078 break;
3079 case ARM::BI__builtin_arm_mve_vcmpcsq_u32:
3080 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3081 break;
3082 case ARM::BI__builtin_arm_mve_vcmpcsq_u8:
3083 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3084 break;
3085 }
3086 Value *Val0 = EmitScalarExpr(E->getArg(0));
3087 Value *Val1 = EmitScalarExpr(E->getArg(1));
3088 Value *Val2 = Builder.CreateICmpUGE(Val0, Val1);
3089 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
3090 return Builder.CreateIntCast(Val3, Int16Ty, false);
3091 }
3092 case ARM::BI__builtin_arm_mve_vmaxq_u16:
3093 case ARM::BI__builtin_arm_mve_vmaxq_u32:
3094 case ARM::BI__builtin_arm_mve_vmaxq_u8: {
3095 Value *Val0 = EmitScalarExpr(E->getArg(0));
3096 Value *Val1 = EmitScalarExpr(E->getArg(1));
3097 Value *Val2 = Builder.CreateICmpUGE(Val0, Val1);
3098 return Builder.CreateSelect(Val2, Val0, Val1);
3099 }
3100 case ARM::BI__builtin_arm_mve_vcmphiq_u16:
3101 case ARM::BI__builtin_arm_mve_vcmphiq_u32:
3102 case ARM::BI__builtin_arm_mve_vcmphiq_u8: {
3103 llvm::Type * Param0;
3104 switch (BuiltinID) {
3105 case ARM::BI__builtin_arm_mve_vcmphiq_u16:
3106 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3107 break;
3108 case ARM::BI__builtin_arm_mve_vcmphiq_u32:
3109 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3110 break;
3111 case ARM::BI__builtin_arm_mve_vcmphiq_u8:
3112 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3113 break;
3114 }
3115 Value *Val0 = EmitScalarExpr(E->getArg(0));
3116 Value *Val1 = EmitScalarExpr(E->getArg(1));
3117 Value *Val2 = Builder.CreateICmpUGT(Val0, Val1);
3118 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val2});
3119 return Builder.CreateIntCast(Val3, Int16Ty, false);
3120 }
3121 case ARM::BI__builtin_arm_mve_vminq_u16:
3122 case ARM::BI__builtin_arm_mve_vminq_u32:
3123 case ARM::BI__builtin_arm_mve_vminq_u8: {
3124 Value *Val0 = EmitScalarExpr(E->getArg(0));
3125 Value *Val1 = EmitScalarExpr(E->getArg(1));
3126 Value *Val2 = Builder.CreateICmpULE(Val0, Val1);
3127 return Builder.CreateSelect(Val2, Val0, Val1);
3128 }
3129 case ARM::BI__builtin_arm_mve_vbicq_n_s32:
3130 case ARM::BI__builtin_arm_mve_vbicq_n_u32: {
3131 bool Param0;
3132 switch (BuiltinID) {
3133 case ARM::BI__builtin_arm_mve_vbicq_n_s32:
3134 Param0 = true;
3135 break;
3136 case ARM::BI__builtin_arm_mve_vbicq_n_u32:
3137 Param0 = false;
3138 break;
3139 }
3140 Value *Val0 = EmitScalarExpr(E->getArg(0));
3141 Value *Val1 = EmitScalarExpr(E->getArg(1));
3142 Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, Param0);
3143 Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
3144 Value *Val4 = Builder.CreateNot(Val3);
3145 return Builder.CreateAnd(Val0, Val4);
3146 }
3147 case ARM::BI__builtin_arm_mve_vorrq_n_s32:
3148 case ARM::BI__builtin_arm_mve_vorrq_n_u32: {
3149 bool Param0;
3150 switch (BuiltinID) {
3151 case ARM::BI__builtin_arm_mve_vorrq_n_s32:
3152 Param0 = true;
3153 break;
3154 case ARM::BI__builtin_arm_mve_vorrq_n_u32:
3155 Param0 = false;
3156 break;
3157 }
3158 Value *Val0 = EmitScalarExpr(E->getArg(0));
3159 Value *Val1 = EmitScalarExpr(E->getArg(1));
3160 Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, Param0);
3161 Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
3162 return Builder.CreateOr(Val0, Val3);
3163 }
3164 case ARM::BI__builtin_arm_mve_vbicq_n_s16:
3165 case ARM::BI__builtin_arm_mve_vbicq_n_u16: {
3166 bool Param0;
3167 switch (BuiltinID) {
3168 case ARM::BI__builtin_arm_mve_vbicq_n_s16:
3169 Param0 = true;
3170 break;
3171 case ARM::BI__builtin_arm_mve_vbicq_n_u16:
3172 Param0 = false;
3173 break;
3174 }
3175 Value *Val0 = EmitScalarExpr(E->getArg(0));
3176 Value *Val1 = EmitScalarExpr(E->getArg(1));
3177 Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, false);
3178 Value *Val3 = Builder.CreateIntCast(Val2, Int16Ty, Param0);
3179 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
3180 Value *Val5 = Builder.CreateNot(Val4);
3181 return Builder.CreateAnd(Val0, Val5);
3182 }
3183 case ARM::BI__builtin_arm_mve_vorrq_n_s16:
3184 case ARM::BI__builtin_arm_mve_vorrq_n_u16: {
3185 bool Param0;
3186 switch (BuiltinID) {
3187 case ARM::BI__builtin_arm_mve_vorrq_n_s16:
3188 Param0 = true;
3189 break;
3190 case ARM::BI__builtin_arm_mve_vorrq_n_u16:
3191 Param0 = false;
3192 break;
3193 }
3194 Value *Val0 = EmitScalarExpr(E->getArg(0));
3195 Value *Val1 = EmitScalarExpr(E->getArg(1));
3196 Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, false);
3197 Value *Val3 = Builder.CreateIntCast(Val2, Int16Ty, Param0);
3198 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
3199 return Builder.CreateOr(Val0, Val4);
3200 }
3201 case ARM::BI__builtin_arm_mve_vshlq_n_s16:
3202 case ARM::BI__builtin_arm_mve_vshlq_n_s32:
3203 case ARM::BI__builtin_arm_mve_vshlq_n_s8:
3204 case ARM::BI__builtin_arm_mve_vshlq_n_u16:
3205 case ARM::BI__builtin_arm_mve_vshlq_n_u32:
3206 case ARM::BI__builtin_arm_mve_vshlq_n_u8: {
3207 llvm::Type * Param0;
3208 bool Param1;
3209 switch (BuiltinID) {
3210 case ARM::BI__builtin_arm_mve_vshlq_n_s16:
3211 Param0 = Int16Ty;
3212 Param1 = true;
3213 break;
3214 case ARM::BI__builtin_arm_mve_vshlq_n_s32:
3215 Param0 = Int32Ty;
3216 Param1 = true;
3217 break;
3218 case ARM::BI__builtin_arm_mve_vshlq_n_s8:
3219 Param0 = Int8Ty;
3220 Param1 = true;
3221 break;
3222 case ARM::BI__builtin_arm_mve_vshlq_n_u16:
3223 Param0 = Int16Ty;
3224 Param1 = false;
3225 break;
3226 case ARM::BI__builtin_arm_mve_vshlq_n_u32:
3227 Param0 = Int32Ty;
3228 Param1 = false;
3229 break;
3230 case ARM::BI__builtin_arm_mve_vshlq_n_u8:
3231 Param0 = Int8Ty;
3232 Param1 = false;
3233 break;
3234 }
3235 Value *Val0 = EmitScalarExpr(E->getArg(0));
3236 Value *Val1 = EmitScalarExpr(E->getArg(1));
3237 Value *Val2 = Builder.CreateIntCast(Val1, Param0, Param1);
3238 Value *Val3 = ARMMVEVectorSplat(Builder, Val2);
3239 return Builder.CreateShl(Val0, Val3);
3240 }
3241 case ARM::BI__builtin_arm_mve_vmlasq_n_s16:
3242 case ARM::BI__builtin_arm_mve_vmlasq_n_s32:
3243 case ARM::BI__builtin_arm_mve_vmlasq_n_s8:
3244 case ARM::BI__builtin_arm_mve_vmlasq_n_u16:
3245 case ARM::BI__builtin_arm_mve_vmlasq_n_u32:
3246 case ARM::BI__builtin_arm_mve_vmlasq_n_u8: {
3247 Value *Val0 = EmitScalarExpr(E->getArg(0));
3248 Value *Val1 = EmitScalarExpr(E->getArg(1));
3249 Value *Val2 = Builder.CreateMul(Val0, Val1);
3250 Value *Val3 = EmitScalarExpr(E->getArg(2));
3251 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
3252 return Builder.CreateAdd(Val2, Val4);
3253 }
3254 case ARM::BI__builtin_arm_mve_vbicq_s16:
3255 case ARM::BI__builtin_arm_mve_vbicq_s32:
3256 case ARM::BI__builtin_arm_mve_vbicq_s8:
3257 case ARM::BI__builtin_arm_mve_vbicq_u16:
3258 case ARM::BI__builtin_arm_mve_vbicq_u32:
3259 case ARM::BI__builtin_arm_mve_vbicq_u8: {
3260 Value *Val0 = EmitScalarExpr(E->getArg(0));
3261 Value *Val1 = EmitScalarExpr(E->getArg(1));
3262 Value *Val2 = Builder.CreateNot(Val1);
3263 return Builder.CreateAnd(Val0, Val2);
3264 }
3265 case ARM::BI__builtin_arm_mve_vornq_s16:
3266 case ARM::BI__builtin_arm_mve_vornq_s32:
3267 case ARM::BI__builtin_arm_mve_vornq_s8:
3268 case ARM::BI__builtin_arm_mve_vornq_u16:
3269 case ARM::BI__builtin_arm_mve_vornq_u32:
3270 case ARM::BI__builtin_arm_mve_vornq_u8: {
3271 Value *Val0 = EmitScalarExpr(E->getArg(0));
3272 Value *Val1 = EmitScalarExpr(E->getArg(1));
3273 Value *Val2 = Builder.CreateNot(Val1);
3274 return Builder.CreateOr(Val0, Val2);
3275 }
3276 case ARM::BI__builtin_arm_mve_vadcq_m_s32:
3277 case ARM::BI__builtin_arm_mve_vadcq_m_u32:
3278 case ARM::BI__builtin_arm_mve_vsbcq_m_s32:
3279 case ARM::BI__builtin_arm_mve_vsbcq_m_u32: {
3280 Intrinsic::ID Param0;
3281 switch (BuiltinID) {
3282 case ARM::BI__builtin_arm_mve_vadcq_m_s32:
3283 Param0 = Intrinsic::arm_mve_vadc_predicated;
3284 break;
3285 case ARM::BI__builtin_arm_mve_vadcq_m_u32:
3286 Param0 = Intrinsic::arm_mve_vadc_predicated;
3287 break;
3288 case ARM::BI__builtin_arm_mve_vsbcq_m_s32:
3289 Param0 = Intrinsic::arm_mve_vsbc_predicated;
3290 break;
3291 case ARM::BI__builtin_arm_mve_vsbcq_m_u32:
3292 Param0 = Intrinsic::arm_mve_vsbc_predicated;
3293 break;
3294 }
3295 Value *Val0 = EmitScalarExpr(E->getArg(0));
3296 Value *Val1 = EmitScalarExpr(E->getArg(1));
3297 Value *Val2 = EmitScalarExpr(E->getArg(2));
3298 Address Val3 = EmitPointerWithAlignment(E->getArg(3));
3299 Value *Val4 = Builder.CreateLoad(Val3);
3300 Value *Val5 = llvm::ConstantInt::get(Int32Ty, 29);
3301 Value *Val6 = Builder.CreateShl(Val4, Val5);
3302 Value *Val7 = EmitScalarExpr(E->getArg(4));
3303 Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
3304 Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val8});
3305 Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val6, Val9});
3306 Value *Val11 = llvm::ConstantInt::get(Int32Ty, 1);
3307 Value *Val12 = Builder.CreateExtractValue(Val10, static_cast<unsigned>(1));
3308 Value *Val13 = llvm::ConstantInt::get(Int32Ty, 29);
3309 Value *Val14 = Builder.CreateLShr(Val12, Val13);
3310 Value *Val15 = Builder.CreateAnd(Val11, Val14);
3311 Builder.CreateStore(Val15, Val3);
3312 return Builder.CreateExtractValue(Val10, static_cast<unsigned>(0));
3313 }
3314 case ARM::BI__builtin_arm_mve_vdwdupq_n_u16:
3315 case ARM::BI__builtin_arm_mve_vdwdupq_n_u32:
3316 case ARM::BI__builtin_arm_mve_vdwdupq_n_u8:
3317 case ARM::BI__builtin_arm_mve_viwdupq_n_u16:
3318 case ARM::BI__builtin_arm_mve_viwdupq_n_u32:
3319 case ARM::BI__builtin_arm_mve_viwdupq_n_u8: {
3320 Intrinsic::ID Param0;
3321 llvm::Type * Param1;
3322 switch (BuiltinID) {
3323 case ARM::BI__builtin_arm_mve_vdwdupq_n_u16:
3324 Param0 = Intrinsic::arm_mve_vdwdup;
3325 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3326 break;
3327 case ARM::BI__builtin_arm_mve_vdwdupq_n_u32:
3328 Param0 = Intrinsic::arm_mve_vdwdup;
3329 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3330 break;
3331 case ARM::BI__builtin_arm_mve_vdwdupq_n_u8:
3332 Param0 = Intrinsic::arm_mve_vdwdup;
3333 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3334 break;
3335 case ARM::BI__builtin_arm_mve_viwdupq_n_u16:
3336 Param0 = Intrinsic::arm_mve_viwdup;
3337 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3338 break;
3339 case ARM::BI__builtin_arm_mve_viwdupq_n_u32:
3340 Param0 = Intrinsic::arm_mve_viwdup;
3341 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3342 break;
3343 case ARM::BI__builtin_arm_mve_viwdupq_n_u8:
3344 Param0 = Intrinsic::arm_mve_viwdup;
3345 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3346 break;
3347 }
3348 Value *Val0 = EmitScalarExpr(E->getArg(0));
3349 Value *Val1 = EmitScalarExpr(E->getArg(1));
3350 Value *Val2 = EmitScalarExpr(E->getArg(2));
3351 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1, Val2});
3352 return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
3353 }
3354 case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f16:
3355 case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f32:
3356 case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f16:
3357 case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f32:
3358 case ARM::BI__builtin_arm_mve_vminnmavq_p_f16:
3359 case ARM::BI__builtin_arm_mve_vminnmavq_p_f32:
3360 case ARM::BI__builtin_arm_mve_vminnmvq_p_f16:
3361 case ARM::BI__builtin_arm_mve_vminnmvq_p_f32: {
3362 llvm::Type * Param0;
3363 Intrinsic::ID Param1;
3364 llvm::Type * Param2;
3365 llvm::Type * Param3;
3366 switch (BuiltinID) {
3367 case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f16:
3368 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3369 Param1 = Intrinsic::arm_mve_maxnmav_predicated;
3370 Param2 = HalfTy;
3371 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
3372 break;
3373 case ARM::BI__builtin_arm_mve_vmaxnmavq_p_f32:
3374 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3375 Param1 = Intrinsic::arm_mve_maxnmav_predicated;
3376 Param2 = FloatTy;
3377 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
3378 break;
3379 case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f16:
3380 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3381 Param1 = Intrinsic::arm_mve_maxnmv_predicated;
3382 Param2 = HalfTy;
3383 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
3384 break;
3385 case ARM::BI__builtin_arm_mve_vmaxnmvq_p_f32:
3386 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3387 Param1 = Intrinsic::arm_mve_maxnmv_predicated;
3388 Param2 = FloatTy;
3389 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
3390 break;
3391 case ARM::BI__builtin_arm_mve_vminnmavq_p_f16:
3392 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3393 Param1 = Intrinsic::arm_mve_minnmav_predicated;
3394 Param2 = HalfTy;
3395 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
3396 break;
3397 case ARM::BI__builtin_arm_mve_vminnmavq_p_f32:
3398 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3399 Param1 = Intrinsic::arm_mve_minnmav_predicated;
3400 Param2 = FloatTy;
3401 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
3402 break;
3403 case ARM::BI__builtin_arm_mve_vminnmvq_p_f16:
3404 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3405 Param1 = Intrinsic::arm_mve_minnmv_predicated;
3406 Param2 = HalfTy;
3407 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
3408 break;
3409 case ARM::BI__builtin_arm_mve_vminnmvq_p_f32:
3410 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3411 Param1 = Intrinsic::arm_mve_minnmv_predicated;
3412 Param2 = FloatTy;
3413 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
3414 break;
3415 }
3416 Value *Val0 = EmitScalarExpr(E->getArg(0));
3417 Value *Val1 = EmitScalarExpr(E->getArg(1));
3418 Value *Val2 = EmitScalarExpr(E->getArg(2));
3419 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3420 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
3421 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param3, Param0}), {Val0, Val1, Val4});
3422 return (Val5);
3423 }
3424 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_s64:
3425 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_u64:
3426 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_f32:
3427 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_s32:
3428 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_u32: {
3429 llvm::Type * Param0;
3430 llvm::Type * Param1;
3431 llvm::Type * Param2;
3432 switch (BuiltinID) {
3433 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_s64:
3434 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
3435 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
3436 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
3437 break;
3438 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_z_u64:
3439 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
3440 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
3441 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
3442 break;
3443 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_f32:
3444 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3445 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
3446 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3447 break;
3448 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_s32:
3449 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3450 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3451 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3452 break;
3453 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_z_u32:
3454 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3455 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3456 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3457 break;
3458 }
3459 Value *Val0 = EmitScalarExpr(E->getArg(0));
3460 Value *Val1 = EmitScalarExpr(E->getArg(1));
3461 Value *Val2 = EmitScalarExpr(E->getArg(2));
3462 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3463 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
3464 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base_predicated, {Param1, Param2, Param0}), {Val0, Val1, Val4});
3465 }
3466 case ARM::BI__builtin_arm_mve_vmaxaq_m_s16:
3467 case ARM::BI__builtin_arm_mve_vmaxaq_m_s32:
3468 case ARM::BI__builtin_arm_mve_vmaxaq_m_s8:
3469 case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f16:
3470 case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f32:
3471 case ARM::BI__builtin_arm_mve_vminaq_m_s16:
3472 case ARM::BI__builtin_arm_mve_vminaq_m_s32:
3473 case ARM::BI__builtin_arm_mve_vminaq_m_s8:
3474 case ARM::BI__builtin_arm_mve_vminnmaq_m_f16:
3475 case ARM::BI__builtin_arm_mve_vminnmaq_m_f32: {
3476 llvm::Type * Param0;
3477 Intrinsic::ID Param1;
3478 llvm::Type * Param2;
3479 switch (BuiltinID) {
3480 case ARM::BI__builtin_arm_mve_vmaxaq_m_s16:
3481 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3482 Param1 = Intrinsic::arm_mve_vmaxa_predicated;
3483 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3484 break;
3485 case ARM::BI__builtin_arm_mve_vmaxaq_m_s32:
3486 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3487 Param1 = Intrinsic::arm_mve_vmaxa_predicated;
3488 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3489 break;
3490 case ARM::BI__builtin_arm_mve_vmaxaq_m_s8:
3491 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3492 Param1 = Intrinsic::arm_mve_vmaxa_predicated;
3493 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3494 break;
3495 case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f16:
3496 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3497 Param1 = Intrinsic::arm_mve_vmaxnma_predicated;
3498 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
3499 break;
3500 case ARM::BI__builtin_arm_mve_vmaxnmaq_m_f32:
3501 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3502 Param1 = Intrinsic::arm_mve_vmaxnma_predicated;
3503 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
3504 break;
3505 case ARM::BI__builtin_arm_mve_vminaq_m_s16:
3506 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3507 Param1 = Intrinsic::arm_mve_vmina_predicated;
3508 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3509 break;
3510 case ARM::BI__builtin_arm_mve_vminaq_m_s32:
3511 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3512 Param1 = Intrinsic::arm_mve_vmina_predicated;
3513 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3514 break;
3515 case ARM::BI__builtin_arm_mve_vminaq_m_s8:
3516 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3517 Param1 = Intrinsic::arm_mve_vmina_predicated;
3518 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3519 break;
3520 case ARM::BI__builtin_arm_mve_vminnmaq_m_f16:
3521 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3522 Param1 = Intrinsic::arm_mve_vminnma_predicated;
3523 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
3524 break;
3525 case ARM::BI__builtin_arm_mve_vminnmaq_m_f32:
3526 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3527 Param1 = Intrinsic::arm_mve_vminnma_predicated;
3528 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
3529 break;
3530 }
3531 Value *Val0 = EmitScalarExpr(E->getArg(0));
3532 Value *Val1 = EmitScalarExpr(E->getArg(1));
3533 Value *Val2 = EmitScalarExpr(E->getArg(2));
3534 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3535 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
3536 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val4});
3537 }
3538 case ARM::BI__builtin_arm_mve_vmaxavq_p_s32:
3539 case ARM::BI__builtin_arm_mve_vminavq_p_s32: {
3540 Intrinsic::ID Param0;
3541 switch (BuiltinID) {
3542 case ARM::BI__builtin_arm_mve_vmaxavq_p_s32:
3543 Param0 = Intrinsic::arm_mve_maxav_predicated;
3544 break;
3545 case ARM::BI__builtin_arm_mve_vminavq_p_s32:
3546 Param0 = Intrinsic::arm_mve_minav_predicated;
3547 break;
3548 }
3549 Value *Val0 = EmitScalarExpr(E->getArg(0));
3550 Value *Val1 = EmitScalarExpr(E->getArg(1));
3551 Value *Val2 = EmitScalarExpr(E->getArg(2));
3552 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3553 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
3554 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val4});
3555 return Builder.CreateIntCast(Val5, Int32Ty, false);
3556 }
3557 case ARM::BI__builtin_arm_mve_vmlaq_m_n_s16:
3558 case ARM::BI__builtin_arm_mve_vmlaq_m_n_s8:
3559 case ARM::BI__builtin_arm_mve_vmlaq_m_n_u16:
3560 case ARM::BI__builtin_arm_mve_vmlaq_m_n_u8:
3561 case ARM::BI__builtin_arm_mve_vmlasq_m_n_s16:
3562 case ARM::BI__builtin_arm_mve_vmlasq_m_n_s8:
3563 case ARM::BI__builtin_arm_mve_vmlasq_m_n_u16:
3564 case ARM::BI__builtin_arm_mve_vmlasq_m_n_u8:
3565 case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s16:
3566 case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s8:
3567 case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s16:
3568 case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s8:
3569 case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s16:
3570 case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s8:
3571 case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s16:
3572 case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s8: {
3573 llvm::Type * Param0;
3574 Intrinsic::ID Param1;
3575 llvm::Type * Param2;
3576 switch (BuiltinID) {
3577 case ARM::BI__builtin_arm_mve_vmlaq_m_n_s16:
3578 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3579 Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3580 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3581 break;
3582 case ARM::BI__builtin_arm_mve_vmlaq_m_n_s8:
3583 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3584 Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3585 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3586 break;
3587 case ARM::BI__builtin_arm_mve_vmlaq_m_n_u16:
3588 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3589 Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3590 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3591 break;
3592 case ARM::BI__builtin_arm_mve_vmlaq_m_n_u8:
3593 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3594 Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3595 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3596 break;
3597 case ARM::BI__builtin_arm_mve_vmlasq_m_n_s16:
3598 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3599 Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3600 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3601 break;
3602 case ARM::BI__builtin_arm_mve_vmlasq_m_n_s8:
3603 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3604 Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3605 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3606 break;
3607 case ARM::BI__builtin_arm_mve_vmlasq_m_n_u16:
3608 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3609 Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3610 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3611 break;
3612 case ARM::BI__builtin_arm_mve_vmlasq_m_n_u8:
3613 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3614 Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3615 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3616 break;
3617 case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s16:
3618 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3619 Param1 = Intrinsic::arm_mve_vqdmlah_predicated;
3620 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3621 break;
3622 case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s8:
3623 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3624 Param1 = Intrinsic::arm_mve_vqdmlah_predicated;
3625 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3626 break;
3627 case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s16:
3628 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3629 Param1 = Intrinsic::arm_mve_vqdmlash_predicated;
3630 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3631 break;
3632 case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s8:
3633 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3634 Param1 = Intrinsic::arm_mve_vqdmlash_predicated;
3635 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3636 break;
3637 case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s16:
3638 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3639 Param1 = Intrinsic::arm_mve_vqrdmlah_predicated;
3640 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3641 break;
3642 case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s8:
3643 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3644 Param1 = Intrinsic::arm_mve_vqrdmlah_predicated;
3645 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3646 break;
3647 case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s16:
3648 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3649 Param1 = Intrinsic::arm_mve_vqrdmlash_predicated;
3650 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3651 break;
3652 case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s8:
3653 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3654 Param1 = Intrinsic::arm_mve_vqrdmlash_predicated;
3655 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3656 break;
3657 }
3658 Value *Val0 = EmitScalarExpr(E->getArg(0));
3659 Value *Val1 = EmitScalarExpr(E->getArg(1));
3660 Value *Val2 = EmitScalarExpr(E->getArg(2));
3661 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3662 Value *Val4 = EmitScalarExpr(E->getArg(3));
3663 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
3664 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
3665 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val3, Val6});
3666 }
3667 case ARM::BI__builtin_arm_mve_vqdmlahq_n_s16:
3668 case ARM::BI__builtin_arm_mve_vqdmlahq_n_s8:
3669 case ARM::BI__builtin_arm_mve_vqdmlashq_n_s16:
3670 case ARM::BI__builtin_arm_mve_vqdmlashq_n_s8:
3671 case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s16:
3672 case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s8:
3673 case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s16:
3674 case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s8: {
3675 Intrinsic::ID Param0;
3676 llvm::Type * Param1;
3677 switch (BuiltinID) {
3678 case ARM::BI__builtin_arm_mve_vqdmlahq_n_s16:
3679 Param0 = Intrinsic::arm_mve_vqdmlah;
3680 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3681 break;
3682 case ARM::BI__builtin_arm_mve_vqdmlahq_n_s8:
3683 Param0 = Intrinsic::arm_mve_vqdmlah;
3684 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3685 break;
3686 case ARM::BI__builtin_arm_mve_vqdmlashq_n_s16:
3687 Param0 = Intrinsic::arm_mve_vqdmlash;
3688 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3689 break;
3690 case ARM::BI__builtin_arm_mve_vqdmlashq_n_s8:
3691 Param0 = Intrinsic::arm_mve_vqdmlash;
3692 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3693 break;
3694 case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s16:
3695 Param0 = Intrinsic::arm_mve_vqrdmlah;
3696 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3697 break;
3698 case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s8:
3699 Param0 = Intrinsic::arm_mve_vqrdmlah;
3700 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3701 break;
3702 case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s16:
3703 Param0 = Intrinsic::arm_mve_vqrdmlash;
3704 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
3705 break;
3706 case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s8:
3707 Param0 = Intrinsic::arm_mve_vqrdmlash;
3708 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
3709 break;
3710 }
3711 Value *Val0 = EmitScalarExpr(E->getArg(0));
3712 Value *Val1 = EmitScalarExpr(E->getArg(1));
3713 Value *Val2 = EmitScalarExpr(E->getArg(2));
3714 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
3715 return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1, Val3});
3716 }
3717 case ARM::BI__builtin_arm_mve_vddupq_m_n_u16:
3718 case ARM::BI__builtin_arm_mve_vddupq_m_n_u32:
3719 case ARM::BI__builtin_arm_mve_vddupq_m_n_u8:
3720 case ARM::BI__builtin_arm_mve_vidupq_m_n_u16:
3721 case ARM::BI__builtin_arm_mve_vidupq_m_n_u32:
3722 case ARM::BI__builtin_arm_mve_vidupq_m_n_u8: {
3723 llvm::Type * Param0;
3724 Intrinsic::ID Param1;
3725 llvm::Type * Param2;
3726 switch (BuiltinID) {
3727 case ARM::BI__builtin_arm_mve_vddupq_m_n_u16:
3728 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3729 Param1 = Intrinsic::arm_mve_vddup_predicated;
3730 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3731 break;
3732 case ARM::BI__builtin_arm_mve_vddupq_m_n_u32:
3733 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3734 Param1 = Intrinsic::arm_mve_vddup_predicated;
3735 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3736 break;
3737 case ARM::BI__builtin_arm_mve_vddupq_m_n_u8:
3738 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3739 Param1 = Intrinsic::arm_mve_vddup_predicated;
3740 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3741 break;
3742 case ARM::BI__builtin_arm_mve_vidupq_m_n_u16:
3743 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3744 Param1 = Intrinsic::arm_mve_vidup_predicated;
3745 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3746 break;
3747 case ARM::BI__builtin_arm_mve_vidupq_m_n_u32:
3748 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3749 Param1 = Intrinsic::arm_mve_vidup_predicated;
3750 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3751 break;
3752 case ARM::BI__builtin_arm_mve_vidupq_m_n_u8:
3753 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3754 Param1 = Intrinsic::arm_mve_vidup_predicated;
3755 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3756 break;
3757 }
3758 Value *Val0 = EmitScalarExpr(E->getArg(0));
3759 Value *Val1 = EmitScalarExpr(E->getArg(1));
3760 Value *Val2 = EmitScalarExpr(E->getArg(2));
3761 Value *Val3 = EmitScalarExpr(E->getArg(3));
3762 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
3763 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
3764 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val2, Val5});
3765 return Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
3766 }
3767 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_s64:
3768 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_u64:
3769 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_f32:
3770 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_s32:
3771 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_u32: {
3772 llvm::Type * Param0;
3773 llvm::Type * Param1;
3774 llvm::Type * Param2;
3775 switch (BuiltinID) {
3776 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_s64:
3777 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
3778 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
3779 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
3780 break;
3781 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_p_u64:
3782 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
3783 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
3784 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
3785 break;
3786 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_f32:
3787 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3788 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3789 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
3790 break;
3791 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_s32:
3792 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3793 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3794 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3795 break;
3796 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_p_u32:
3797 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3798 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
3799 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3800 break;
3801 }
3802 Value *Val0 = EmitScalarExpr(E->getArg(0));
3803 Value *Val1 = EmitScalarExpr(E->getArg(1));
3804 Value *Val2 = EmitScalarExpr(E->getArg(2));
3805 Value *Val3 = EmitScalarExpr(E->getArg(3));
3806 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
3807 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
3808 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base_predicated, {Param1, Param2, Param0}), {Val0, Val1, Val2, Val5});
3809 }
3810 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f16:
3811 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f32:
3812 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s16:
3813 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s32:
3814 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s8:
3815 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u16:
3816 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u32:
3817 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u8:
3818 case ARM::BI__builtin_arm_mve_vmlaq_m_n_s32:
3819 case ARM::BI__builtin_arm_mve_vmlaq_m_n_u32:
3820 case ARM::BI__builtin_arm_mve_vmlasq_m_n_s32:
3821 case ARM::BI__builtin_arm_mve_vmlasq_m_n_u32:
3822 case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s32:
3823 case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s32:
3824 case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s32:
3825 case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s32:
3826 case ARM::BI__builtin_arm_mve_vsliq_m_n_s16:
3827 case ARM::BI__builtin_arm_mve_vsliq_m_n_s32:
3828 case ARM::BI__builtin_arm_mve_vsliq_m_n_s8:
3829 case ARM::BI__builtin_arm_mve_vsliq_m_n_u16:
3830 case ARM::BI__builtin_arm_mve_vsliq_m_n_u32:
3831 case ARM::BI__builtin_arm_mve_vsliq_m_n_u8:
3832 case ARM::BI__builtin_arm_mve_vsriq_m_n_s16:
3833 case ARM::BI__builtin_arm_mve_vsriq_m_n_s32:
3834 case ARM::BI__builtin_arm_mve_vsriq_m_n_s8:
3835 case ARM::BI__builtin_arm_mve_vsriq_m_n_u16:
3836 case ARM::BI__builtin_arm_mve_vsriq_m_n_u32:
3837 case ARM::BI__builtin_arm_mve_vsriq_m_n_u8: {
3838 llvm::Type * Param0;
3839 Intrinsic::ID Param1;
3840 llvm::Type * Param2;
3841 switch (BuiltinID) {
3842 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f16:
3843 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3844 Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3845 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
3846 break;
3847 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_f32:
3848 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3849 Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3850 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
3851 break;
3852 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s16:
3853 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3854 Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3855 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3856 break;
3857 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s32:
3858 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3859 Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3860 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3861 break;
3862 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_s8:
3863 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3864 Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3865 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3866 break;
3867 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u16:
3868 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3869 Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3870 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3871 break;
3872 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u32:
3873 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3874 Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3875 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3876 break;
3877 case ARM::BI__builtin_arm_mve_vbrsrq_m_n_u8:
3878 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3879 Param1 = Intrinsic::arm_mve_vbrsr_predicated;
3880 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3881 break;
3882 case ARM::BI__builtin_arm_mve_vmlaq_m_n_s32:
3883 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3884 Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3885 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3886 break;
3887 case ARM::BI__builtin_arm_mve_vmlaq_m_n_u32:
3888 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3889 Param1 = Intrinsic::arm_mve_vmla_n_predicated;
3890 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3891 break;
3892 case ARM::BI__builtin_arm_mve_vmlasq_m_n_s32:
3893 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3894 Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3895 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3896 break;
3897 case ARM::BI__builtin_arm_mve_vmlasq_m_n_u32:
3898 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3899 Param1 = Intrinsic::arm_mve_vmlas_n_predicated;
3900 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3901 break;
3902 case ARM::BI__builtin_arm_mve_vqdmlahq_m_n_s32:
3903 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3904 Param1 = Intrinsic::arm_mve_vqdmlah_predicated;
3905 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3906 break;
3907 case ARM::BI__builtin_arm_mve_vqdmlashq_m_n_s32:
3908 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3909 Param1 = Intrinsic::arm_mve_vqdmlash_predicated;
3910 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3911 break;
3912 case ARM::BI__builtin_arm_mve_vqrdmlahq_m_n_s32:
3913 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3914 Param1 = Intrinsic::arm_mve_vqrdmlah_predicated;
3915 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3916 break;
3917 case ARM::BI__builtin_arm_mve_vqrdmlashq_m_n_s32:
3918 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3919 Param1 = Intrinsic::arm_mve_vqrdmlash_predicated;
3920 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3921 break;
3922 case ARM::BI__builtin_arm_mve_vsliq_m_n_s16:
3923 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3924 Param1 = Intrinsic::arm_mve_vsli_predicated;
3925 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3926 break;
3927 case ARM::BI__builtin_arm_mve_vsliq_m_n_s32:
3928 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3929 Param1 = Intrinsic::arm_mve_vsli_predicated;
3930 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3931 break;
3932 case ARM::BI__builtin_arm_mve_vsliq_m_n_s8:
3933 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3934 Param1 = Intrinsic::arm_mve_vsli_predicated;
3935 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3936 break;
3937 case ARM::BI__builtin_arm_mve_vsliq_m_n_u16:
3938 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3939 Param1 = Intrinsic::arm_mve_vsli_predicated;
3940 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3941 break;
3942 case ARM::BI__builtin_arm_mve_vsliq_m_n_u32:
3943 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3944 Param1 = Intrinsic::arm_mve_vsli_predicated;
3945 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3946 break;
3947 case ARM::BI__builtin_arm_mve_vsliq_m_n_u8:
3948 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3949 Param1 = Intrinsic::arm_mve_vsli_predicated;
3950 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3951 break;
3952 case ARM::BI__builtin_arm_mve_vsriq_m_n_s16:
3953 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3954 Param1 = Intrinsic::arm_mve_vsri_predicated;
3955 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3956 break;
3957 case ARM::BI__builtin_arm_mve_vsriq_m_n_s32:
3958 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3959 Param1 = Intrinsic::arm_mve_vsri_predicated;
3960 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3961 break;
3962 case ARM::BI__builtin_arm_mve_vsriq_m_n_s8:
3963 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3964 Param1 = Intrinsic::arm_mve_vsri_predicated;
3965 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3966 break;
3967 case ARM::BI__builtin_arm_mve_vsriq_m_n_u16:
3968 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
3969 Param1 = Intrinsic::arm_mve_vsri_predicated;
3970 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
3971 break;
3972 case ARM::BI__builtin_arm_mve_vsriq_m_n_u32:
3973 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
3974 Param1 = Intrinsic::arm_mve_vsri_predicated;
3975 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
3976 break;
3977 case ARM::BI__builtin_arm_mve_vsriq_m_n_u8:
3978 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
3979 Param1 = Intrinsic::arm_mve_vsri_predicated;
3980 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
3981 break;
3982 }
3983 Value *Val0 = EmitScalarExpr(E->getArg(0));
3984 Value *Val1 = EmitScalarExpr(E->getArg(1));
3985 Value *Val2 = EmitScalarExpr(E->getArg(2));
3986 Value *Val3 = EmitScalarExpr(E->getArg(3));
3987 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
3988 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
3989 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val2, Val5});
3990 }
3991 case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u16:
3992 case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u32:
3993 case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u8:
3994 case ARM::BI__builtin_arm_mve_viwdupq_m_n_u16:
3995 case ARM::BI__builtin_arm_mve_viwdupq_m_n_u32:
3996 case ARM::BI__builtin_arm_mve_viwdupq_m_n_u8: {
3997 llvm::Type * Param0;
3998 Intrinsic::ID Param1;
3999 llvm::Type * Param2;
4000 switch (BuiltinID) {
4001 case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u16:
4002 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4003 Param1 = Intrinsic::arm_mve_vdwdup_predicated;
4004 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
4005 break;
4006 case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u32:
4007 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4008 Param1 = Intrinsic::arm_mve_vdwdup_predicated;
4009 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
4010 break;
4011 case ARM::BI__builtin_arm_mve_vdwdupq_m_n_u8:
4012 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4013 Param1 = Intrinsic::arm_mve_vdwdup_predicated;
4014 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
4015 break;
4016 case ARM::BI__builtin_arm_mve_viwdupq_m_n_u16:
4017 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4018 Param1 = Intrinsic::arm_mve_viwdup_predicated;
4019 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
4020 break;
4021 case ARM::BI__builtin_arm_mve_viwdupq_m_n_u32:
4022 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4023 Param1 = Intrinsic::arm_mve_viwdup_predicated;
4024 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
4025 break;
4026 case ARM::BI__builtin_arm_mve_viwdupq_m_n_u8:
4027 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4028 Param1 = Intrinsic::arm_mve_viwdup_predicated;
4029 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
4030 break;
4031 }
4032 Value *Val0 = EmitScalarExpr(E->getArg(0));
4033 Value *Val1 = EmitScalarExpr(E->getArg(1));
4034 Value *Val2 = EmitScalarExpr(E->getArg(2));
4035 Value *Val3 = EmitScalarExpr(E->getArg(3));
4036 Value *Val4 = EmitScalarExpr(E->getArg(4));
4037 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
4038 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
4039 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val2, Val3, Val6});
4040 return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
4041 }
4042 case ARM::BI__builtin_arm_mve_vadciq_m_s32:
4043 case ARM::BI__builtin_arm_mve_vadciq_m_u32: {
4044 Value *Val0 = EmitScalarExpr(E->getArg(0));
4045 Value *Val1 = EmitScalarExpr(E->getArg(1));
4046 Value *Val2 = EmitScalarExpr(E->getArg(2));
4047 Value *Val3 = llvm::ConstantInt::get(Int32Ty, 0);
4048 Value *Val4 = EmitScalarExpr(E->getArg(4));
4049 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
4050 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
4051 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vadc_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val3, Val6});
4052 Value *Val8 = llvm::ConstantInt::get(Int32Ty, 1);
4053 Value *Val9 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(1));
4054 Value *Val10 = llvm::ConstantInt::get(Int32Ty, 29);
4055 Value *Val11 = Builder.CreateLShr(Val9, Val10);
4056 Value *Val12 = Builder.CreateAnd(Val8, Val11);
4057 Address Val13 = EmitPointerWithAlignment(E->getArg(3));
4058 Builder.CreateStore(Val12, Val13);
4059 return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
4060 }
4061 case ARM::BI__builtin_arm_mve_vsbciq_m_s32:
4062 case ARM::BI__builtin_arm_mve_vsbciq_m_u32: {
4063 Value *Val0 = EmitScalarExpr(E->getArg(0));
4064 Value *Val1 = EmitScalarExpr(E->getArg(1));
4065 Value *Val2 = EmitScalarExpr(E->getArg(2));
4066 Value *Val3 = llvm::ConstantInt::get(Int32Ty, 1);
4067 Value *Val4 = llvm::ConstantInt::get(Int32Ty, 29);
4068 Value *Val5 = Builder.CreateShl(Val3, Val4);
4069 Value *Val6 = EmitScalarExpr(E->getArg(4));
4070 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
4071 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
4072 Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vsbc_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val5, Val8});
4073 Value *Val10 = llvm::ConstantInt::get(Int32Ty, 1);
4074 Value *Val11 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
4075 Value *Val12 = llvm::ConstantInt::get(Int32Ty, 29);
4076 Value *Val13 = Builder.CreateLShr(Val11, Val12);
4077 Value *Val14 = Builder.CreateAnd(Val10, Val13);
4078 Address Val15 = EmitPointerWithAlignment(E->getArg(3));
4079 Builder.CreateStore(Val14, Val15);
4080 return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
4081 }
4082 case ARM::BI__builtin_arm_mve_vqdmladhq_m_s16:
4083 case ARM::BI__builtin_arm_mve_vqdmladhq_m_s32:
4084 case ARM::BI__builtin_arm_mve_vqdmladhq_m_s8:
4085 case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s16:
4086 case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s32:
4087 case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s8:
4088 case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s16:
4089 case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s32:
4090 case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s8:
4091 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s16:
4092 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s32:
4093 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s8:
4094 case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s16:
4095 case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s32:
4096 case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s8:
4097 case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s16:
4098 case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s32:
4099 case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s8:
4100 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s16:
4101 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s32:
4102 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s8:
4103 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s16:
4104 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s32:
4105 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s8: {
4106 uint32_t Param0;
4107 uint32_t Param1;
4108 uint32_t Param2;
4109 llvm::Type * Param3;
4110 llvm::Type * Param4;
4111 switch (BuiltinID) {
4112 case ARM::BI__builtin_arm_mve_vqdmladhq_m_s16:
4113 Param0 = 0;
4114 Param1 = 0;
4115 Param2 = 0;
4116 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4117 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4118 break;
4119 case ARM::BI__builtin_arm_mve_vqdmladhq_m_s32:
4120 Param0 = 0;
4121 Param1 = 0;
4122 Param2 = 0;
4123 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4124 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4125 break;
4126 case ARM::BI__builtin_arm_mve_vqdmladhq_m_s8:
4127 Param0 = 0;
4128 Param1 = 0;
4129 Param2 = 0;
4130 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4131 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4132 break;
4133 case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s16:
4134 Param0 = 1;
4135 Param1 = 0;
4136 Param2 = 0;
4137 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4138 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4139 break;
4140 case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s32:
4141 Param0 = 1;
4142 Param1 = 0;
4143 Param2 = 0;
4144 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4145 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4146 break;
4147 case ARM::BI__builtin_arm_mve_vqdmladhxq_m_s8:
4148 Param0 = 1;
4149 Param1 = 0;
4150 Param2 = 0;
4151 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4152 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4153 break;
4154 case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s16:
4155 Param0 = 0;
4156 Param1 = 0;
4157 Param2 = 1;
4158 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4159 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4160 break;
4161 case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s32:
4162 Param0 = 0;
4163 Param1 = 0;
4164 Param2 = 1;
4165 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4166 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4167 break;
4168 case ARM::BI__builtin_arm_mve_vqdmlsdhq_m_s8:
4169 Param0 = 0;
4170 Param1 = 0;
4171 Param2 = 1;
4172 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4173 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4174 break;
4175 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s16:
4176 Param0 = 1;
4177 Param1 = 0;
4178 Param2 = 1;
4179 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4180 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4181 break;
4182 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s32:
4183 Param0 = 1;
4184 Param1 = 0;
4185 Param2 = 1;
4186 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4187 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4188 break;
4189 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_m_s8:
4190 Param0 = 1;
4191 Param1 = 0;
4192 Param2 = 1;
4193 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4194 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4195 break;
4196 case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s16:
4197 Param0 = 0;
4198 Param1 = 1;
4199 Param2 = 0;
4200 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4201 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4202 break;
4203 case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s32:
4204 Param0 = 0;
4205 Param1 = 1;
4206 Param2 = 0;
4207 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4208 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4209 break;
4210 case ARM::BI__builtin_arm_mve_vqrdmladhq_m_s8:
4211 Param0 = 0;
4212 Param1 = 1;
4213 Param2 = 0;
4214 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4215 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4216 break;
4217 case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s16:
4218 Param0 = 1;
4219 Param1 = 1;
4220 Param2 = 0;
4221 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4222 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4223 break;
4224 case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s32:
4225 Param0 = 1;
4226 Param1 = 1;
4227 Param2 = 0;
4228 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4229 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4230 break;
4231 case ARM::BI__builtin_arm_mve_vqrdmladhxq_m_s8:
4232 Param0 = 1;
4233 Param1 = 1;
4234 Param2 = 0;
4235 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4236 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4237 break;
4238 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s16:
4239 Param0 = 0;
4240 Param1 = 1;
4241 Param2 = 1;
4242 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4243 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4244 break;
4245 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s32:
4246 Param0 = 0;
4247 Param1 = 1;
4248 Param2 = 1;
4249 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4250 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4251 break;
4252 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_m_s8:
4253 Param0 = 0;
4254 Param1 = 1;
4255 Param2 = 1;
4256 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4257 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4258 break;
4259 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s16:
4260 Param0 = 1;
4261 Param1 = 1;
4262 Param2 = 1;
4263 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4264 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
4265 break;
4266 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s32:
4267 Param0 = 1;
4268 Param1 = 1;
4269 Param2 = 1;
4270 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4271 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
4272 break;
4273 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_m_s8:
4274 Param0 = 1;
4275 Param1 = 1;
4276 Param2 = 1;
4277 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
4278 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
4279 break;
4280 }
4281 Value *Val0 = EmitScalarExpr(E->getArg(0));
4282 Value *Val1 = EmitScalarExpr(E->getArg(1));
4283 Value *Val2 = EmitScalarExpr(E->getArg(2));
4284 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
4285 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
4286 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
4287 Value *Val6 = EmitScalarExpr(E->getArg(3));
4288 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
4289 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val7});
4290 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmlad_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val5, Val8});
4291 }
4292 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s16:
4293 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s32:
4294 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u16:
4295 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u32:
4296 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s16:
4297 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s32:
4298 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u16:
4299 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u32:
4300 case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s16:
4301 case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s32:
4302 case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s16:
4303 case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s32:
4304 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s16:
4305 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s32:
4306 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u16:
4307 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u32:
4308 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s16:
4309 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s32:
4310 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u16:
4311 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u32:
4312 case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s16:
4313 case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s32:
4314 case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s16:
4315 case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s32:
4316 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s16:
4317 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s32:
4318 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u16:
4319 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u32:
4320 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s16:
4321 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s32:
4322 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u16:
4323 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u32:
4324 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s16:
4325 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s32:
4326 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u16:
4327 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u32:
4328 case ARM::BI__builtin_arm_mve_vshrntq_m_n_s16:
4329 case ARM::BI__builtin_arm_mve_vshrntq_m_n_s32:
4330 case ARM::BI__builtin_arm_mve_vshrntq_m_n_u16:
4331 case ARM::BI__builtin_arm_mve_vshrntq_m_n_u32: {
4332 uint32_t Param0;
4333 uint32_t Param1;
4334 uint32_t Param2;
4335 uint32_t Param3;
4336 uint32_t Param4;
4337 llvm::Type * Param5;
4338 llvm::Type * Param6;
4339 llvm::Type * Param7;
4340 switch (BuiltinID) {
4341 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s16:
4342 Param0 = 1;
4343 Param1 = 1;
4344 Param2 = 0;
4345 Param3 = 0;
4346 Param4 = 0;
4347 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4348 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4349 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4350 break;
4351 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_s32:
4352 Param0 = 1;
4353 Param1 = 1;
4354 Param2 = 0;
4355 Param3 = 0;
4356 Param4 = 0;
4357 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4358 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4359 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4360 break;
4361 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u16:
4362 Param0 = 1;
4363 Param1 = 1;
4364 Param2 = 1;
4365 Param3 = 1;
4366 Param4 = 0;
4367 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4368 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4369 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4370 break;
4371 case ARM::BI__builtin_arm_mve_vqrshrnbq_m_n_u32:
4372 Param0 = 1;
4373 Param1 = 1;
4374 Param2 = 1;
4375 Param3 = 1;
4376 Param4 = 0;
4377 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4378 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4379 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4380 break;
4381 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s16:
4382 Param0 = 1;
4383 Param1 = 1;
4384 Param2 = 0;
4385 Param3 = 0;
4386 Param4 = 1;
4387 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4388 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4389 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4390 break;
4391 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_s32:
4392 Param0 = 1;
4393 Param1 = 1;
4394 Param2 = 0;
4395 Param3 = 0;
4396 Param4 = 1;
4397 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4398 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4399 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4400 break;
4401 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u16:
4402 Param0 = 1;
4403 Param1 = 1;
4404 Param2 = 1;
4405 Param3 = 1;
4406 Param4 = 1;
4407 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4408 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4409 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4410 break;
4411 case ARM::BI__builtin_arm_mve_vqrshrntq_m_n_u32:
4412 Param0 = 1;
4413 Param1 = 1;
4414 Param2 = 1;
4415 Param3 = 1;
4416 Param4 = 1;
4417 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4418 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4419 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4420 break;
4421 case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s16:
4422 Param0 = 1;
4423 Param1 = 1;
4424 Param2 = 1;
4425 Param3 = 0;
4426 Param4 = 0;
4427 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4428 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4429 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4430 break;
4431 case ARM::BI__builtin_arm_mve_vqrshrunbq_m_n_s32:
4432 Param0 = 1;
4433 Param1 = 1;
4434 Param2 = 1;
4435 Param3 = 0;
4436 Param4 = 0;
4437 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4438 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4439 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4440 break;
4441 case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s16:
4442 Param0 = 1;
4443 Param1 = 1;
4444 Param2 = 1;
4445 Param3 = 0;
4446 Param4 = 1;
4447 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4448 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4449 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4450 break;
4451 case ARM::BI__builtin_arm_mve_vqrshruntq_m_n_s32:
4452 Param0 = 1;
4453 Param1 = 1;
4454 Param2 = 1;
4455 Param3 = 0;
4456 Param4 = 1;
4457 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4458 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4459 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4460 break;
4461 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s16:
4462 Param0 = 1;
4463 Param1 = 0;
4464 Param2 = 0;
4465 Param3 = 0;
4466 Param4 = 0;
4467 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4468 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4469 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4470 break;
4471 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_s32:
4472 Param0 = 1;
4473 Param1 = 0;
4474 Param2 = 0;
4475 Param3 = 0;
4476 Param4 = 0;
4477 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4478 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4479 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4480 break;
4481 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u16:
4482 Param0 = 1;
4483 Param1 = 0;
4484 Param2 = 1;
4485 Param3 = 1;
4486 Param4 = 0;
4487 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4488 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4489 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4490 break;
4491 case ARM::BI__builtin_arm_mve_vqshrnbq_m_n_u32:
4492 Param0 = 1;
4493 Param1 = 0;
4494 Param2 = 1;
4495 Param3 = 1;
4496 Param4 = 0;
4497 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4498 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4499 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4500 break;
4501 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s16:
4502 Param0 = 1;
4503 Param1 = 0;
4504 Param2 = 0;
4505 Param3 = 0;
4506 Param4 = 1;
4507 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4508 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4509 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4510 break;
4511 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_s32:
4512 Param0 = 1;
4513 Param1 = 0;
4514 Param2 = 0;
4515 Param3 = 0;
4516 Param4 = 1;
4517 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4518 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4519 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4520 break;
4521 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u16:
4522 Param0 = 1;
4523 Param1 = 0;
4524 Param2 = 1;
4525 Param3 = 1;
4526 Param4 = 1;
4527 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4528 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4529 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4530 break;
4531 case ARM::BI__builtin_arm_mve_vqshrntq_m_n_u32:
4532 Param0 = 1;
4533 Param1 = 0;
4534 Param2 = 1;
4535 Param3 = 1;
4536 Param4 = 1;
4537 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4538 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4539 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4540 break;
4541 case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s16:
4542 Param0 = 1;
4543 Param1 = 0;
4544 Param2 = 1;
4545 Param3 = 0;
4546 Param4 = 0;
4547 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4548 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4549 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4550 break;
4551 case ARM::BI__builtin_arm_mve_vqshrunbq_m_n_s32:
4552 Param0 = 1;
4553 Param1 = 0;
4554 Param2 = 1;
4555 Param3 = 0;
4556 Param4 = 0;
4557 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4558 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4559 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4560 break;
4561 case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s16:
4562 Param0 = 1;
4563 Param1 = 0;
4564 Param2 = 1;
4565 Param3 = 0;
4566 Param4 = 1;
4567 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4568 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4569 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4570 break;
4571 case ARM::BI__builtin_arm_mve_vqshruntq_m_n_s32:
4572 Param0 = 1;
4573 Param1 = 0;
4574 Param2 = 1;
4575 Param3 = 0;
4576 Param4 = 1;
4577 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4578 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4579 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4580 break;
4581 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s16:
4582 Param0 = 0;
4583 Param1 = 1;
4584 Param2 = 0;
4585 Param3 = 0;
4586 Param4 = 0;
4587 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4588 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4589 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4590 break;
4591 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_s32:
4592 Param0 = 0;
4593 Param1 = 1;
4594 Param2 = 0;
4595 Param3 = 0;
4596 Param4 = 0;
4597 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4598 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4599 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4600 break;
4601 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u16:
4602 Param0 = 0;
4603 Param1 = 1;
4604 Param2 = 1;
4605 Param3 = 1;
4606 Param4 = 0;
4607 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4608 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4609 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4610 break;
4611 case ARM::BI__builtin_arm_mve_vrshrnbq_m_n_u32:
4612 Param0 = 0;
4613 Param1 = 1;
4614 Param2 = 1;
4615 Param3 = 1;
4616 Param4 = 0;
4617 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4618 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4619 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4620 break;
4621 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s16:
4622 Param0 = 0;
4623 Param1 = 1;
4624 Param2 = 0;
4625 Param3 = 0;
4626 Param4 = 1;
4627 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4628 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4629 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4630 break;
4631 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_s32:
4632 Param0 = 0;
4633 Param1 = 1;
4634 Param2 = 0;
4635 Param3 = 0;
4636 Param4 = 1;
4637 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4638 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4639 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4640 break;
4641 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u16:
4642 Param0 = 0;
4643 Param1 = 1;
4644 Param2 = 1;
4645 Param3 = 1;
4646 Param4 = 1;
4647 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4648 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4649 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4650 break;
4651 case ARM::BI__builtin_arm_mve_vrshrntq_m_n_u32:
4652 Param0 = 0;
4653 Param1 = 1;
4654 Param2 = 1;
4655 Param3 = 1;
4656 Param4 = 1;
4657 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4658 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4659 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4660 break;
4661 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s16:
4662 Param0 = 0;
4663 Param1 = 0;
4664 Param2 = 0;
4665 Param3 = 0;
4666 Param4 = 0;
4667 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4668 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4669 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4670 break;
4671 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_s32:
4672 Param0 = 0;
4673 Param1 = 0;
4674 Param2 = 0;
4675 Param3 = 0;
4676 Param4 = 0;
4677 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4678 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4679 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4680 break;
4681 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u16:
4682 Param0 = 0;
4683 Param1 = 0;
4684 Param2 = 1;
4685 Param3 = 1;
4686 Param4 = 0;
4687 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4688 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4689 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4690 break;
4691 case ARM::BI__builtin_arm_mve_vshrnbq_m_n_u32:
4692 Param0 = 0;
4693 Param1 = 0;
4694 Param2 = 1;
4695 Param3 = 1;
4696 Param4 = 0;
4697 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4698 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4699 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4700 break;
4701 case ARM::BI__builtin_arm_mve_vshrntq_m_n_s16:
4702 Param0 = 0;
4703 Param1 = 0;
4704 Param2 = 0;
4705 Param3 = 0;
4706 Param4 = 1;
4707 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4708 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4709 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4710 break;
4711 case ARM::BI__builtin_arm_mve_vshrntq_m_n_s32:
4712 Param0 = 0;
4713 Param1 = 0;
4714 Param2 = 0;
4715 Param3 = 0;
4716 Param4 = 1;
4717 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4718 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4719 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4720 break;
4721 case ARM::BI__builtin_arm_mve_vshrntq_m_n_u16:
4722 Param0 = 0;
4723 Param1 = 0;
4724 Param2 = 1;
4725 Param3 = 1;
4726 Param4 = 1;
4727 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
4728 Param6 = llvm::FixedVectorType::get(Int8Ty, 16);
4729 Param7 = llvm::FixedVectorType::get(Int16Ty, 8);
4730 break;
4731 case ARM::BI__builtin_arm_mve_vshrntq_m_n_u32:
4732 Param0 = 0;
4733 Param1 = 0;
4734 Param2 = 1;
4735 Param3 = 1;
4736 Param4 = 1;
4737 Param5 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
4738 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4739 Param7 = llvm::FixedVectorType::get(Int32Ty, 4);
4740 break;
4741 }
4742 Value *Val0 = EmitScalarExpr(E->getArg(0));
4743 Value *Val1 = EmitScalarExpr(E->getArg(1));
4744 Value *Val2 = EmitScalarExpr(E->getArg(2));
4745 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
4746 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
4747 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
4748 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param3);
4749 Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param4);
4750 Value *Val8 = EmitScalarExpr(E->getArg(3));
4751 Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
4752 Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param5}), {Val9});
4753 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshrn_predicated, {Param6, Param7, Param5}), {Val0, Val1, Val2, Val3, Val4, Val5, Val6, Val7, Val10});
4754 }
4755 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s16:
4756 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s32:
4757 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u16:
4758 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u32:
4759 case ARM::BI__builtin_arm_mve_vqrshrntq_n_s16:
4760 case ARM::BI__builtin_arm_mve_vqrshrntq_n_s32:
4761 case ARM::BI__builtin_arm_mve_vqrshrntq_n_u16:
4762 case ARM::BI__builtin_arm_mve_vqrshrntq_n_u32:
4763 case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s16:
4764 case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s32:
4765 case ARM::BI__builtin_arm_mve_vqrshruntq_n_s16:
4766 case ARM::BI__builtin_arm_mve_vqrshruntq_n_s32:
4767 case ARM::BI__builtin_arm_mve_vqshrnbq_n_s16:
4768 case ARM::BI__builtin_arm_mve_vqshrnbq_n_s32:
4769 case ARM::BI__builtin_arm_mve_vqshrnbq_n_u16:
4770 case ARM::BI__builtin_arm_mve_vqshrnbq_n_u32:
4771 case ARM::BI__builtin_arm_mve_vqshrntq_n_s16:
4772 case ARM::BI__builtin_arm_mve_vqshrntq_n_s32:
4773 case ARM::BI__builtin_arm_mve_vqshrntq_n_u16:
4774 case ARM::BI__builtin_arm_mve_vqshrntq_n_u32:
4775 case ARM::BI__builtin_arm_mve_vqshrunbq_n_s16:
4776 case ARM::BI__builtin_arm_mve_vqshrunbq_n_s32:
4777 case ARM::BI__builtin_arm_mve_vqshruntq_n_s16:
4778 case ARM::BI__builtin_arm_mve_vqshruntq_n_s32:
4779 case ARM::BI__builtin_arm_mve_vrshrnbq_n_s16:
4780 case ARM::BI__builtin_arm_mve_vrshrnbq_n_s32:
4781 case ARM::BI__builtin_arm_mve_vrshrnbq_n_u16:
4782 case ARM::BI__builtin_arm_mve_vrshrnbq_n_u32:
4783 case ARM::BI__builtin_arm_mve_vrshrntq_n_s16:
4784 case ARM::BI__builtin_arm_mve_vrshrntq_n_s32:
4785 case ARM::BI__builtin_arm_mve_vrshrntq_n_u16:
4786 case ARM::BI__builtin_arm_mve_vrshrntq_n_u32:
4787 case ARM::BI__builtin_arm_mve_vshrnbq_n_s16:
4788 case ARM::BI__builtin_arm_mve_vshrnbq_n_s32:
4789 case ARM::BI__builtin_arm_mve_vshrnbq_n_u16:
4790 case ARM::BI__builtin_arm_mve_vshrnbq_n_u32:
4791 case ARM::BI__builtin_arm_mve_vshrntq_n_s16:
4792 case ARM::BI__builtin_arm_mve_vshrntq_n_s32:
4793 case ARM::BI__builtin_arm_mve_vshrntq_n_u16:
4794 case ARM::BI__builtin_arm_mve_vshrntq_n_u32: {
4795 uint32_t Param0;
4796 uint32_t Param1;
4797 uint32_t Param2;
4798 uint32_t Param3;
4799 uint32_t Param4;
4800 llvm::Type * Param5;
4801 llvm::Type * Param6;
4802 switch (BuiltinID) {
4803 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s16:
4804 Param0 = 1;
4805 Param1 = 1;
4806 Param2 = 0;
4807 Param3 = 0;
4808 Param4 = 0;
4809 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4810 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4811 break;
4812 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_s32:
4813 Param0 = 1;
4814 Param1 = 1;
4815 Param2 = 0;
4816 Param3 = 0;
4817 Param4 = 0;
4818 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4819 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4820 break;
4821 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u16:
4822 Param0 = 1;
4823 Param1 = 1;
4824 Param2 = 1;
4825 Param3 = 1;
4826 Param4 = 0;
4827 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4828 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4829 break;
4830 case ARM::BI__builtin_arm_mve_vqrshrnbq_n_u32:
4831 Param0 = 1;
4832 Param1 = 1;
4833 Param2 = 1;
4834 Param3 = 1;
4835 Param4 = 0;
4836 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4837 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4838 break;
4839 case ARM::BI__builtin_arm_mve_vqrshrntq_n_s16:
4840 Param0 = 1;
4841 Param1 = 1;
4842 Param2 = 0;
4843 Param3 = 0;
4844 Param4 = 1;
4845 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4846 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4847 break;
4848 case ARM::BI__builtin_arm_mve_vqrshrntq_n_s32:
4849 Param0 = 1;
4850 Param1 = 1;
4851 Param2 = 0;
4852 Param3 = 0;
4853 Param4 = 1;
4854 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4855 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4856 break;
4857 case ARM::BI__builtin_arm_mve_vqrshrntq_n_u16:
4858 Param0 = 1;
4859 Param1 = 1;
4860 Param2 = 1;
4861 Param3 = 1;
4862 Param4 = 1;
4863 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4864 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4865 break;
4866 case ARM::BI__builtin_arm_mve_vqrshrntq_n_u32:
4867 Param0 = 1;
4868 Param1 = 1;
4869 Param2 = 1;
4870 Param3 = 1;
4871 Param4 = 1;
4872 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4873 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4874 break;
4875 case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s16:
4876 Param0 = 1;
4877 Param1 = 1;
4878 Param2 = 1;
4879 Param3 = 0;
4880 Param4 = 0;
4881 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4882 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4883 break;
4884 case ARM::BI__builtin_arm_mve_vqrshrunbq_n_s32:
4885 Param0 = 1;
4886 Param1 = 1;
4887 Param2 = 1;
4888 Param3 = 0;
4889 Param4 = 0;
4890 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4891 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4892 break;
4893 case ARM::BI__builtin_arm_mve_vqrshruntq_n_s16:
4894 Param0 = 1;
4895 Param1 = 1;
4896 Param2 = 1;
4897 Param3 = 0;
4898 Param4 = 1;
4899 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4900 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4901 break;
4902 case ARM::BI__builtin_arm_mve_vqrshruntq_n_s32:
4903 Param0 = 1;
4904 Param1 = 1;
4905 Param2 = 1;
4906 Param3 = 0;
4907 Param4 = 1;
4908 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4909 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4910 break;
4911 case ARM::BI__builtin_arm_mve_vqshrnbq_n_s16:
4912 Param0 = 1;
4913 Param1 = 0;
4914 Param2 = 0;
4915 Param3 = 0;
4916 Param4 = 0;
4917 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4918 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4919 break;
4920 case ARM::BI__builtin_arm_mve_vqshrnbq_n_s32:
4921 Param0 = 1;
4922 Param1 = 0;
4923 Param2 = 0;
4924 Param3 = 0;
4925 Param4 = 0;
4926 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4927 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4928 break;
4929 case ARM::BI__builtin_arm_mve_vqshrnbq_n_u16:
4930 Param0 = 1;
4931 Param1 = 0;
4932 Param2 = 1;
4933 Param3 = 1;
4934 Param4 = 0;
4935 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4936 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4937 break;
4938 case ARM::BI__builtin_arm_mve_vqshrnbq_n_u32:
4939 Param0 = 1;
4940 Param1 = 0;
4941 Param2 = 1;
4942 Param3 = 1;
4943 Param4 = 0;
4944 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4945 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4946 break;
4947 case ARM::BI__builtin_arm_mve_vqshrntq_n_s16:
4948 Param0 = 1;
4949 Param1 = 0;
4950 Param2 = 0;
4951 Param3 = 0;
4952 Param4 = 1;
4953 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4954 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4955 break;
4956 case ARM::BI__builtin_arm_mve_vqshrntq_n_s32:
4957 Param0 = 1;
4958 Param1 = 0;
4959 Param2 = 0;
4960 Param3 = 0;
4961 Param4 = 1;
4962 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4963 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4964 break;
4965 case ARM::BI__builtin_arm_mve_vqshrntq_n_u16:
4966 Param0 = 1;
4967 Param1 = 0;
4968 Param2 = 1;
4969 Param3 = 1;
4970 Param4 = 1;
4971 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4972 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4973 break;
4974 case ARM::BI__builtin_arm_mve_vqshrntq_n_u32:
4975 Param0 = 1;
4976 Param1 = 0;
4977 Param2 = 1;
4978 Param3 = 1;
4979 Param4 = 1;
4980 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4981 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
4982 break;
4983 case ARM::BI__builtin_arm_mve_vqshrunbq_n_s16:
4984 Param0 = 1;
4985 Param1 = 0;
4986 Param2 = 1;
4987 Param3 = 0;
4988 Param4 = 0;
4989 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
4990 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
4991 break;
4992 case ARM::BI__builtin_arm_mve_vqshrunbq_n_s32:
4993 Param0 = 1;
4994 Param1 = 0;
4995 Param2 = 1;
4996 Param3 = 0;
4997 Param4 = 0;
4998 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
4999 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5000 break;
5001 case ARM::BI__builtin_arm_mve_vqshruntq_n_s16:
5002 Param0 = 1;
5003 Param1 = 0;
5004 Param2 = 1;
5005 Param3 = 0;
5006 Param4 = 1;
5007 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5008 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5009 break;
5010 case ARM::BI__builtin_arm_mve_vqshruntq_n_s32:
5011 Param0 = 1;
5012 Param1 = 0;
5013 Param2 = 1;
5014 Param3 = 0;
5015 Param4 = 1;
5016 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5017 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5018 break;
5019 case ARM::BI__builtin_arm_mve_vrshrnbq_n_s16:
5020 Param0 = 0;
5021 Param1 = 1;
5022 Param2 = 0;
5023 Param3 = 0;
5024 Param4 = 0;
5025 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5026 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5027 break;
5028 case ARM::BI__builtin_arm_mve_vrshrnbq_n_s32:
5029 Param0 = 0;
5030 Param1 = 1;
5031 Param2 = 0;
5032 Param3 = 0;
5033 Param4 = 0;
5034 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5035 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5036 break;
5037 case ARM::BI__builtin_arm_mve_vrshrnbq_n_u16:
5038 Param0 = 0;
5039 Param1 = 1;
5040 Param2 = 1;
5041 Param3 = 1;
5042 Param4 = 0;
5043 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5044 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5045 break;
5046 case ARM::BI__builtin_arm_mve_vrshrnbq_n_u32:
5047 Param0 = 0;
5048 Param1 = 1;
5049 Param2 = 1;
5050 Param3 = 1;
5051 Param4 = 0;
5052 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5053 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5054 break;
5055 case ARM::BI__builtin_arm_mve_vrshrntq_n_s16:
5056 Param0 = 0;
5057 Param1 = 1;
5058 Param2 = 0;
5059 Param3 = 0;
5060 Param4 = 1;
5061 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5062 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5063 break;
5064 case ARM::BI__builtin_arm_mve_vrshrntq_n_s32:
5065 Param0 = 0;
5066 Param1 = 1;
5067 Param2 = 0;
5068 Param3 = 0;
5069 Param4 = 1;
5070 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5071 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5072 break;
5073 case ARM::BI__builtin_arm_mve_vrshrntq_n_u16:
5074 Param0 = 0;
5075 Param1 = 1;
5076 Param2 = 1;
5077 Param3 = 1;
5078 Param4 = 1;
5079 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5080 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5081 break;
5082 case ARM::BI__builtin_arm_mve_vrshrntq_n_u32:
5083 Param0 = 0;
5084 Param1 = 1;
5085 Param2 = 1;
5086 Param3 = 1;
5087 Param4 = 1;
5088 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5089 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5090 break;
5091 case ARM::BI__builtin_arm_mve_vshrnbq_n_s16:
5092 Param0 = 0;
5093 Param1 = 0;
5094 Param2 = 0;
5095 Param3 = 0;
5096 Param4 = 0;
5097 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5098 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5099 break;
5100 case ARM::BI__builtin_arm_mve_vshrnbq_n_s32:
5101 Param0 = 0;
5102 Param1 = 0;
5103 Param2 = 0;
5104 Param3 = 0;
5105 Param4 = 0;
5106 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5107 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5108 break;
5109 case ARM::BI__builtin_arm_mve_vshrnbq_n_u16:
5110 Param0 = 0;
5111 Param1 = 0;
5112 Param2 = 1;
5113 Param3 = 1;
5114 Param4 = 0;
5115 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5116 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5117 break;
5118 case ARM::BI__builtin_arm_mve_vshrnbq_n_u32:
5119 Param0 = 0;
5120 Param1 = 0;
5121 Param2 = 1;
5122 Param3 = 1;
5123 Param4 = 0;
5124 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5125 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5126 break;
5127 case ARM::BI__builtin_arm_mve_vshrntq_n_s16:
5128 Param0 = 0;
5129 Param1 = 0;
5130 Param2 = 0;
5131 Param3 = 0;
5132 Param4 = 1;
5133 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5134 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5135 break;
5136 case ARM::BI__builtin_arm_mve_vshrntq_n_s32:
5137 Param0 = 0;
5138 Param1 = 0;
5139 Param2 = 0;
5140 Param3 = 0;
5141 Param4 = 1;
5142 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5143 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5144 break;
5145 case ARM::BI__builtin_arm_mve_vshrntq_n_u16:
5146 Param0 = 0;
5147 Param1 = 0;
5148 Param2 = 1;
5149 Param3 = 1;
5150 Param4 = 1;
5151 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
5152 Param6 = llvm::FixedVectorType::get(Int16Ty, 8);
5153 break;
5154 case ARM::BI__builtin_arm_mve_vshrntq_n_u32:
5155 Param0 = 0;
5156 Param1 = 0;
5157 Param2 = 1;
5158 Param3 = 1;
5159 Param4 = 1;
5160 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5161 Param6 = llvm::FixedVectorType::get(Int32Ty, 4);
5162 break;
5163 }
5164 Value *Val0 = EmitScalarExpr(E->getArg(0));
5165 Value *Val1 = EmitScalarExpr(E->getArg(1));
5166 Value *Val2 = EmitScalarExpr(E->getArg(2));
5167 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
5168 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
5169 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
5170 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param3);
5171 Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param4);
5172 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshrn, {Param5, Param6}), {Val0, Val1, Val2, Val3, Val4, Val5, Val6, Val7});
5173 }
5174 case ARM::BI__builtin_arm_mve_vqdmladhq_s16:
5175 case ARM::BI__builtin_arm_mve_vqdmladhq_s32:
5176 case ARM::BI__builtin_arm_mve_vqdmladhq_s8:
5177 case ARM::BI__builtin_arm_mve_vqdmladhxq_s16:
5178 case ARM::BI__builtin_arm_mve_vqdmladhxq_s32:
5179 case ARM::BI__builtin_arm_mve_vqdmladhxq_s8:
5180 case ARM::BI__builtin_arm_mve_vqdmlsdhq_s16:
5181 case ARM::BI__builtin_arm_mve_vqdmlsdhq_s32:
5182 case ARM::BI__builtin_arm_mve_vqdmlsdhq_s8:
5183 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s16:
5184 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s32:
5185 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s8:
5186 case ARM::BI__builtin_arm_mve_vqrdmladhq_s16:
5187 case ARM::BI__builtin_arm_mve_vqrdmladhq_s32:
5188 case ARM::BI__builtin_arm_mve_vqrdmladhq_s8:
5189 case ARM::BI__builtin_arm_mve_vqrdmladhxq_s16:
5190 case ARM::BI__builtin_arm_mve_vqrdmladhxq_s32:
5191 case ARM::BI__builtin_arm_mve_vqrdmladhxq_s8:
5192 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s16:
5193 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s32:
5194 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s8:
5195 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s16:
5196 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s32:
5197 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s8: {
5198 uint32_t Param0;
5199 uint32_t Param1;
5200 uint32_t Param2;
5201 llvm::Type * Param3;
5202 switch (BuiltinID) {
5203 case ARM::BI__builtin_arm_mve_vqdmladhq_s16:
5204 Param0 = 0;
5205 Param1 = 0;
5206 Param2 = 0;
5207 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5208 break;
5209 case ARM::BI__builtin_arm_mve_vqdmladhq_s32:
5210 Param0 = 0;
5211 Param1 = 0;
5212 Param2 = 0;
5213 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5214 break;
5215 case ARM::BI__builtin_arm_mve_vqdmladhq_s8:
5216 Param0 = 0;
5217 Param1 = 0;
5218 Param2 = 0;
5219 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5220 break;
5221 case ARM::BI__builtin_arm_mve_vqdmladhxq_s16:
5222 Param0 = 1;
5223 Param1 = 0;
5224 Param2 = 0;
5225 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5226 break;
5227 case ARM::BI__builtin_arm_mve_vqdmladhxq_s32:
5228 Param0 = 1;
5229 Param1 = 0;
5230 Param2 = 0;
5231 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5232 break;
5233 case ARM::BI__builtin_arm_mve_vqdmladhxq_s8:
5234 Param0 = 1;
5235 Param1 = 0;
5236 Param2 = 0;
5237 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5238 break;
5239 case ARM::BI__builtin_arm_mve_vqdmlsdhq_s16:
5240 Param0 = 0;
5241 Param1 = 0;
5242 Param2 = 1;
5243 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5244 break;
5245 case ARM::BI__builtin_arm_mve_vqdmlsdhq_s32:
5246 Param0 = 0;
5247 Param1 = 0;
5248 Param2 = 1;
5249 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5250 break;
5251 case ARM::BI__builtin_arm_mve_vqdmlsdhq_s8:
5252 Param0 = 0;
5253 Param1 = 0;
5254 Param2 = 1;
5255 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5256 break;
5257 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s16:
5258 Param0 = 1;
5259 Param1 = 0;
5260 Param2 = 1;
5261 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5262 break;
5263 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s32:
5264 Param0 = 1;
5265 Param1 = 0;
5266 Param2 = 1;
5267 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5268 break;
5269 case ARM::BI__builtin_arm_mve_vqdmlsdhxq_s8:
5270 Param0 = 1;
5271 Param1 = 0;
5272 Param2 = 1;
5273 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5274 break;
5275 case ARM::BI__builtin_arm_mve_vqrdmladhq_s16:
5276 Param0 = 0;
5277 Param1 = 1;
5278 Param2 = 0;
5279 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5280 break;
5281 case ARM::BI__builtin_arm_mve_vqrdmladhq_s32:
5282 Param0 = 0;
5283 Param1 = 1;
5284 Param2 = 0;
5285 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5286 break;
5287 case ARM::BI__builtin_arm_mve_vqrdmladhq_s8:
5288 Param0 = 0;
5289 Param1 = 1;
5290 Param2 = 0;
5291 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5292 break;
5293 case ARM::BI__builtin_arm_mve_vqrdmladhxq_s16:
5294 Param0 = 1;
5295 Param1 = 1;
5296 Param2 = 0;
5297 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5298 break;
5299 case ARM::BI__builtin_arm_mve_vqrdmladhxq_s32:
5300 Param0 = 1;
5301 Param1 = 1;
5302 Param2 = 0;
5303 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5304 break;
5305 case ARM::BI__builtin_arm_mve_vqrdmladhxq_s8:
5306 Param0 = 1;
5307 Param1 = 1;
5308 Param2 = 0;
5309 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5310 break;
5311 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s16:
5312 Param0 = 0;
5313 Param1 = 1;
5314 Param2 = 1;
5315 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5316 break;
5317 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s32:
5318 Param0 = 0;
5319 Param1 = 1;
5320 Param2 = 1;
5321 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5322 break;
5323 case ARM::BI__builtin_arm_mve_vqrdmlsdhq_s8:
5324 Param0 = 0;
5325 Param1 = 1;
5326 Param2 = 1;
5327 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5328 break;
5329 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s16:
5330 Param0 = 1;
5331 Param1 = 1;
5332 Param2 = 1;
5333 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5334 break;
5335 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s32:
5336 Param0 = 1;
5337 Param1 = 1;
5338 Param2 = 1;
5339 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5340 break;
5341 case ARM::BI__builtin_arm_mve_vqrdmlsdhxq_s8:
5342 Param0 = 1;
5343 Param1 = 1;
5344 Param2 = 1;
5345 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
5346 break;
5347 }
5348 Value *Val0 = EmitScalarExpr(E->getArg(0));
5349 Value *Val1 = EmitScalarExpr(E->getArg(1));
5350 Value *Val2 = EmitScalarExpr(E->getArg(2));
5351 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
5352 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
5353 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param2);
5354 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmlad, {Param3}), {Val0, Val1, Val2, Val3, Val4, Val5});
5355 }
5356 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_s64:
5357 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_u64:
5358 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_f32:
5359 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_s32:
5360 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_u32: {
5361 llvm::Type * Param0;
5362 llvm::Type * Param1;
5363 switch (BuiltinID) {
5364 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_s64:
5365 Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
5366 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
5367 break;
5368 case ARM::BI__builtin_arm_mve_vstrdq_scatter_base_u64:
5369 Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
5370 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
5371 break;
5372 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_f32:
5373 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
5374 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
5375 break;
5376 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_s32:
5377 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
5378 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5379 break;
5380 case ARM::BI__builtin_arm_mve_vstrwq_scatter_base_u32:
5381 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
5382 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5383 break;
5384 }
5385 Value *Val0 = EmitScalarExpr(E->getArg(0));
5386 Value *Val1 = EmitScalarExpr(E->getArg(1));
5387 Value *Val2 = EmitScalarExpr(E->getArg(2));
5388 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vstr_scatter_base, {Param0, Param1}), {Val0, Val1, Val2});
5389 }
5390 case ARM::BI__builtin_arm_mve_vqdmlahq_n_s32:
5391 case ARM::BI__builtin_arm_mve_vqdmlashq_n_s32:
5392 case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s32:
5393 case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s32:
5394 case ARM::BI__builtin_arm_mve_vsliq_n_s16:
5395 case ARM::BI__builtin_arm_mve_vsliq_n_s32:
5396 case ARM::BI__builtin_arm_mve_vsliq_n_s8:
5397 case ARM::BI__builtin_arm_mve_vsliq_n_u16:
5398 case ARM::BI__builtin_arm_mve_vsliq_n_u32:
5399 case ARM::BI__builtin_arm_mve_vsliq_n_u8:
5400 case ARM::BI__builtin_arm_mve_vsriq_n_s16:
5401 case ARM::BI__builtin_arm_mve_vsriq_n_s32:
5402 case ARM::BI__builtin_arm_mve_vsriq_n_s8:
5403 case ARM::BI__builtin_arm_mve_vsriq_n_u16:
5404 case ARM::BI__builtin_arm_mve_vsriq_n_u32:
5405 case ARM::BI__builtin_arm_mve_vsriq_n_u8: {
5406 Intrinsic::ID Param0;
5407 llvm::Type * Param1;
5408 switch (BuiltinID) {
5409 case ARM::BI__builtin_arm_mve_vqdmlahq_n_s32:
5410 Param0 = Intrinsic::arm_mve_vqdmlah;
5411 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5412 break;
5413 case ARM::BI__builtin_arm_mve_vqdmlashq_n_s32:
5414 Param0 = Intrinsic::arm_mve_vqdmlash;
5415 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5416 break;
5417 case ARM::BI__builtin_arm_mve_vqrdmlahq_n_s32:
5418 Param0 = Intrinsic::arm_mve_vqrdmlah;
5419 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5420 break;
5421 case ARM::BI__builtin_arm_mve_vqrdmlashq_n_s32:
5422 Param0 = Intrinsic::arm_mve_vqrdmlash;
5423 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5424 break;
5425 case ARM::BI__builtin_arm_mve_vsliq_n_s16:
5426 Param0 = Intrinsic::arm_mve_vsli;
5427 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
5428 break;
5429 case ARM::BI__builtin_arm_mve_vsliq_n_s32:
5430 Param0 = Intrinsic::arm_mve_vsli;
5431 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5432 break;
5433 case ARM::BI__builtin_arm_mve_vsliq_n_s8:
5434 Param0 = Intrinsic::arm_mve_vsli;
5435 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
5436 break;
5437 case ARM::BI__builtin_arm_mve_vsliq_n_u16:
5438 Param0 = Intrinsic::arm_mve_vsli;
5439 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
5440 break;
5441 case ARM::BI__builtin_arm_mve_vsliq_n_u32:
5442 Param0 = Intrinsic::arm_mve_vsli;
5443 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5444 break;
5445 case ARM::BI__builtin_arm_mve_vsliq_n_u8:
5446 Param0 = Intrinsic::arm_mve_vsli;
5447 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
5448 break;
5449 case ARM::BI__builtin_arm_mve_vsriq_n_s16:
5450 Param0 = Intrinsic::arm_mve_vsri;
5451 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
5452 break;
5453 case ARM::BI__builtin_arm_mve_vsriq_n_s32:
5454 Param0 = Intrinsic::arm_mve_vsri;
5455 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5456 break;
5457 case ARM::BI__builtin_arm_mve_vsriq_n_s8:
5458 Param0 = Intrinsic::arm_mve_vsri;
5459 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
5460 break;
5461 case ARM::BI__builtin_arm_mve_vsriq_n_u16:
5462 Param0 = Intrinsic::arm_mve_vsri;
5463 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
5464 break;
5465 case ARM::BI__builtin_arm_mve_vsriq_n_u32:
5466 Param0 = Intrinsic::arm_mve_vsri;
5467 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
5468 break;
5469 case ARM::BI__builtin_arm_mve_vsriq_n_u8:
5470 Param0 = Intrinsic::arm_mve_vsri;
5471 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
5472 break;
5473 }
5474 Value *Val0 = EmitScalarExpr(E->getArg(0));
5475 Value *Val1 = EmitScalarExpr(E->getArg(1));
5476 Value *Val2 = EmitScalarExpr(E->getArg(2));
5477 return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1, Val2});
5478 }
5479 case ARM::BI__builtin_arm_mve_vadciq_s32:
5480 case ARM::BI__builtin_arm_mve_vadciq_u32: {
5481 Value *Val0 = EmitScalarExpr(E->getArg(0));
5482 Value *Val1 = EmitScalarExpr(E->getArg(1));
5483 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 0);
5484 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vadc, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val2});
5485 Value *Val4 = llvm::ConstantInt::get(Int32Ty, 1);
5486 Value *Val5 = Builder.CreateExtractValue(Val3, static_cast<unsigned>(1));
5487 Value *Val6 = llvm::ConstantInt::get(Int32Ty, 29);
5488 Value *Val7 = Builder.CreateLShr(Val5, Val6);
5489 Value *Val8 = Builder.CreateAnd(Val4, Val7);
5490 Address Val9 = EmitPointerWithAlignment(E->getArg(2));
5491 Builder.CreateStore(Val8, Val9);
5492 return Builder.CreateExtractValue(Val3, static_cast<unsigned>(0));
5493 }
5494 case ARM::BI__builtin_arm_mve_vsbciq_s32:
5495 case ARM::BI__builtin_arm_mve_vsbciq_u32: {
5496 Value *Val0 = EmitScalarExpr(E->getArg(0));
5497 Value *Val1 = EmitScalarExpr(E->getArg(1));
5498 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
5499 Value *Val3 = llvm::ConstantInt::get(Int32Ty, 29);
5500 Value *Val4 = Builder.CreateShl(Val2, Val3);
5501 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vsbc, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val4});
5502 Value *Val6 = llvm::ConstantInt::get(Int32Ty, 1);
5503 Value *Val7 = Builder.CreateExtractValue(Val5, static_cast<unsigned>(1));
5504 Value *Val8 = llvm::ConstantInt::get(Int32Ty, 29);
5505 Value *Val9 = Builder.CreateLShr(Val7, Val8);
5506 Value *Val10 = Builder.CreateAnd(Val6, Val9);
5507 Address Val11 = EmitPointerWithAlignment(E->getArg(2));
5508 Builder.CreateStore(Val10, Val11);
5509 return Builder.CreateExtractValue(Val5, static_cast<unsigned>(0));
5510 }
5511 case ARM::BI__builtin_arm_mve_vmaxvq_s32:
5512 case ARM::BI__builtin_arm_mve_vmaxvq_u32:
5513 case ARM::BI__builtin_arm_mve_vminvq_s32:
5514 case ARM::BI__builtin_arm_mve_vminvq_u32: {
5515 uint32_t Param0;
5516 Intrinsic::ID Param1;
5517 bool Param2;
5518 switch (BuiltinID) {
5519 case ARM::BI__builtin_arm_mve_vmaxvq_s32:
5520 Param0 = 0;
5521 Param1 = Intrinsic::arm_mve_maxv;
5522 Param2 = true;
5523 break;
5524 case ARM::BI__builtin_arm_mve_vmaxvq_u32:
5525 Param0 = 1;
5526 Param1 = Intrinsic::arm_mve_maxv;
5527 Param2 = false;
5528 break;
5529 case ARM::BI__builtin_arm_mve_vminvq_s32:
5530 Param0 = 0;
5531 Param1 = Intrinsic::arm_mve_minv;
5532 Param2 = true;
5533 break;
5534 case ARM::BI__builtin_arm_mve_vminvq_u32:
5535 Param0 = 1;
5536 Param1 = Intrinsic::arm_mve_minv;
5537 Param2 = false;
5538 break;
5539 }
5540 Value *Val0 = EmitScalarExpr(E->getArg(0));
5541 Value *Val1 = EmitScalarExpr(E->getArg(1));
5542 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
5543 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4)}), {Val0, Val1, Val2});
5544 return Builder.CreateIntCast(Val3, Int32Ty, Param2);
5545 }
5546 case ARM::BI__builtin_arm_mve_vmovnbq_m_s16:
5547 case ARM::BI__builtin_arm_mve_vmovnbq_m_s32:
5548 case ARM::BI__builtin_arm_mve_vmovnbq_m_u16:
5549 case ARM::BI__builtin_arm_mve_vmovnbq_m_u32:
5550 case ARM::BI__builtin_arm_mve_vmovntq_m_s16:
5551 case ARM::BI__builtin_arm_mve_vmovntq_m_s32:
5552 case ARM::BI__builtin_arm_mve_vmovntq_m_u16:
5553 case ARM::BI__builtin_arm_mve_vmovntq_m_u32: {
5554 uint32_t Param0;
5555 llvm::Type * Param1;
5556 llvm::Type * Param2;
5557 llvm::Type * Param3;
5558 switch (BuiltinID) {
5559 case ARM::BI__builtin_arm_mve_vmovnbq_m_s16:
5560 Param0 = 0;
5561 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5562 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
5563 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5564 break;
5565 case ARM::BI__builtin_arm_mve_vmovnbq_m_s32:
5566 Param0 = 0;
5567 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5568 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
5569 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5570 break;
5571 case ARM::BI__builtin_arm_mve_vmovnbq_m_u16:
5572 Param0 = 0;
5573 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5574 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
5575 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5576 break;
5577 case ARM::BI__builtin_arm_mve_vmovnbq_m_u32:
5578 Param0 = 0;
5579 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5580 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
5581 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5582 break;
5583 case ARM::BI__builtin_arm_mve_vmovntq_m_s16:
5584 Param0 = 1;
5585 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5586 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
5587 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5588 break;
5589 case ARM::BI__builtin_arm_mve_vmovntq_m_s32:
5590 Param0 = 1;
5591 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5592 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
5593 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5594 break;
5595 case ARM::BI__builtin_arm_mve_vmovntq_m_u16:
5596 Param0 = 1;
5597 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5598 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
5599 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
5600 break;
5601 case ARM::BI__builtin_arm_mve_vmovntq_m_u32:
5602 Param0 = 1;
5603 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5604 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
5605 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
5606 break;
5607 }
5608 Value *Val0 = EmitScalarExpr(E->getArg(0));
5609 Value *Val1 = EmitScalarExpr(E->getArg(1));
5610 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
5611 Value *Val3 = EmitScalarExpr(E->getArg(2));
5612 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
5613 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
5614 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmovn_predicated, {Param2, Param3, Param1}), {Val0, Val1, Val2, Val5});
5615 }
5616 case ARM::BI__builtin_arm_mve_vmaxvq_p_s32:
5617 case ARM::BI__builtin_arm_mve_vmaxvq_p_u32:
5618 case ARM::BI__builtin_arm_mve_vminvq_p_s32:
5619 case ARM::BI__builtin_arm_mve_vminvq_p_u32: {
5620 uint32_t Param0;
5621 Intrinsic::ID Param1;
5622 bool Param2;
5623 switch (BuiltinID) {
5624 case ARM::BI__builtin_arm_mve_vmaxvq_p_s32:
5625 Param0 = 0;
5626 Param1 = Intrinsic::arm_mve_maxv_predicated;
5627 Param2 = true;
5628 break;
5629 case ARM::BI__builtin_arm_mve_vmaxvq_p_u32:
5630 Param0 = 1;
5631 Param1 = Intrinsic::arm_mve_maxv_predicated;
5632 Param2 = false;
5633 break;
5634 case ARM::BI__builtin_arm_mve_vminvq_p_s32:
5635 Param0 = 0;
5636 Param1 = Intrinsic::arm_mve_minv_predicated;
5637 Param2 = true;
5638 break;
5639 case ARM::BI__builtin_arm_mve_vminvq_p_u32:
5640 Param0 = 1;
5641 Param1 = Intrinsic::arm_mve_minv_predicated;
5642 Param2 = false;
5643 break;
5644 }
5645 Value *Val0 = EmitScalarExpr(E->getArg(0));
5646 Value *Val1 = EmitScalarExpr(E->getArg(1));
5647 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
5648 Value *Val3 = EmitScalarExpr(E->getArg(2));
5649 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
5650 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
5651 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val0, Val1, Val2, Val5});
5652 return Builder.CreateIntCast(Val6, Int32Ty, Param2);
5653 }
5654 case ARM::BI__builtin_arm_mve_vcvtbq_m_f16_f32:
5655 case ARM::BI__builtin_arm_mve_vcvtbq_m_f32_f16:
5656 case ARM::BI__builtin_arm_mve_vcvttq_m_f16_f32:
5657 case ARM::BI__builtin_arm_mve_vcvttq_m_f32_f16: {
5658 uint32_t Param0;
5659 Intrinsic::ID Param1;
5660 switch (BuiltinID) {
5661 case ARM::BI__builtin_arm_mve_vcvtbq_m_f16_f32:
5662 Param0 = 0;
5663 Param1 = Intrinsic::arm_mve_vcvt_narrow_predicated;
5664 break;
5665 case ARM::BI__builtin_arm_mve_vcvtbq_m_f32_f16:
5666 Param0 = 0;
5667 Param1 = Intrinsic::arm_mve_vcvt_widen_predicated;
5668 break;
5669 case ARM::BI__builtin_arm_mve_vcvttq_m_f16_f32:
5670 Param0 = 1;
5671 Param1 = Intrinsic::arm_mve_vcvt_narrow_predicated;
5672 break;
5673 case ARM::BI__builtin_arm_mve_vcvttq_m_f32_f16:
5674 Param0 = 1;
5675 Param1 = Intrinsic::arm_mve_vcvt_widen_predicated;
5676 break;
5677 }
5678 Value *Val0 = EmitScalarExpr(E->getArg(0));
5679 Value *Val1 = EmitScalarExpr(E->getArg(1));
5680 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
5681 Value *Val3 = EmitScalarExpr(E->getArg(2));
5682 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
5683 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
5684 return Builder.CreateCall(CGM.getIntrinsic(Param1), {Val0, Val1, Val2, Val5});
5685 }
5686 case ARM::BI__builtin_arm_mve_vqmovnbq_m_s16:
5687 case ARM::BI__builtin_arm_mve_vqmovnbq_m_s32:
5688 case ARM::BI__builtin_arm_mve_vqmovnbq_m_u16:
5689 case ARM::BI__builtin_arm_mve_vqmovnbq_m_u32:
5690 case ARM::BI__builtin_arm_mve_vqmovntq_m_s16:
5691 case ARM::BI__builtin_arm_mve_vqmovntq_m_s32:
5692 case ARM::BI__builtin_arm_mve_vqmovntq_m_u16:
5693 case ARM::BI__builtin_arm_mve_vqmovntq_m_u32:
5694 case ARM::BI__builtin_arm_mve_vqmovunbq_m_s16:
5695 case ARM::BI__builtin_arm_mve_vqmovunbq_m_s32:
5696 case ARM::BI__builtin_arm_mve_vqmovuntq_m_s16:
5697 case ARM::BI__builtin_arm_mve_vqmovuntq_m_s32: {
5698 uint32_t Param0;
5699 uint32_t Param1;
5700 uint32_t Param2;
5701 llvm::Type * Param3;
5702 llvm::Type * Param4;
5703 llvm::Type * Param5;
5704 switch (BuiltinID) {
5705 case ARM::BI__builtin_arm_mve_vqmovnbq_m_s16:
5706 Param0 = 0;
5707 Param1 = 0;
5708 Param2 = 0;
5709 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5710 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5711 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5712 break;
5713 case ARM::BI__builtin_arm_mve_vqmovnbq_m_s32:
5714 Param0 = 0;
5715 Param1 = 0;
5716 Param2 = 0;
5717 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5718 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5719 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5720 break;
5721 case ARM::BI__builtin_arm_mve_vqmovnbq_m_u16:
5722 Param0 = 1;
5723 Param1 = 1;
5724 Param2 = 0;
5725 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5726 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5727 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5728 break;
5729 case ARM::BI__builtin_arm_mve_vqmovnbq_m_u32:
5730 Param0 = 1;
5731 Param1 = 1;
5732 Param2 = 0;
5733 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5734 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5735 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5736 break;
5737 case ARM::BI__builtin_arm_mve_vqmovntq_m_s16:
5738 Param0 = 0;
5739 Param1 = 0;
5740 Param2 = 1;
5741 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5742 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5743 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5744 break;
5745 case ARM::BI__builtin_arm_mve_vqmovntq_m_s32:
5746 Param0 = 0;
5747 Param1 = 0;
5748 Param2 = 1;
5749 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5750 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5751 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5752 break;
5753 case ARM::BI__builtin_arm_mve_vqmovntq_m_u16:
5754 Param0 = 1;
5755 Param1 = 1;
5756 Param2 = 1;
5757 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5758 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5759 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5760 break;
5761 case ARM::BI__builtin_arm_mve_vqmovntq_m_u32:
5762 Param0 = 1;
5763 Param1 = 1;
5764 Param2 = 1;
5765 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5766 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5767 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5768 break;
5769 case ARM::BI__builtin_arm_mve_vqmovunbq_m_s16:
5770 Param0 = 1;
5771 Param1 = 0;
5772 Param2 = 0;
5773 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5774 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5775 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5776 break;
5777 case ARM::BI__builtin_arm_mve_vqmovunbq_m_s32:
5778 Param0 = 1;
5779 Param1 = 0;
5780 Param2 = 0;
5781 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5782 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5783 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5784 break;
5785 case ARM::BI__builtin_arm_mve_vqmovuntq_m_s16:
5786 Param0 = 1;
5787 Param1 = 0;
5788 Param2 = 1;
5789 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5790 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5791 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
5792 break;
5793 case ARM::BI__builtin_arm_mve_vqmovuntq_m_s32:
5794 Param0 = 1;
5795 Param1 = 0;
5796 Param2 = 1;
5797 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5798 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5799 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
5800 break;
5801 }
5802 Value *Val0 = EmitScalarExpr(E->getArg(0));
5803 Value *Val1 = EmitScalarExpr(E->getArg(1));
5804 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
5805 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
5806 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
5807 Value *Val5 = EmitScalarExpr(E->getArg(2));
5808 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
5809 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
5810 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqmovn_predicated, {Param4, Param5, Param3}), {Val0, Val1, Val2, Val3, Val4, Val7});
5811 }
5812 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s16:
5813 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s32:
5814 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s8:
5815 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u16:
5816 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u32:
5817 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u8:
5818 case ARM::BI__builtin_arm_mve_vqshlq_m_r_s16:
5819 case ARM::BI__builtin_arm_mve_vqshlq_m_r_s32:
5820 case ARM::BI__builtin_arm_mve_vqshlq_m_r_s8:
5821 case ARM::BI__builtin_arm_mve_vqshlq_m_r_u16:
5822 case ARM::BI__builtin_arm_mve_vqshlq_m_r_u32:
5823 case ARM::BI__builtin_arm_mve_vqshlq_m_r_u8:
5824 case ARM::BI__builtin_arm_mve_vrshlq_m_n_s16:
5825 case ARM::BI__builtin_arm_mve_vrshlq_m_n_s32:
5826 case ARM::BI__builtin_arm_mve_vrshlq_m_n_s8:
5827 case ARM::BI__builtin_arm_mve_vrshlq_m_n_u16:
5828 case ARM::BI__builtin_arm_mve_vrshlq_m_n_u32:
5829 case ARM::BI__builtin_arm_mve_vrshlq_m_n_u8:
5830 case ARM::BI__builtin_arm_mve_vshlq_m_r_s16:
5831 case ARM::BI__builtin_arm_mve_vshlq_m_r_s32:
5832 case ARM::BI__builtin_arm_mve_vshlq_m_r_s8:
5833 case ARM::BI__builtin_arm_mve_vshlq_m_r_u16:
5834 case ARM::BI__builtin_arm_mve_vshlq_m_r_u32:
5835 case ARM::BI__builtin_arm_mve_vshlq_m_r_u8: {
5836 uint32_t Param0;
5837 uint32_t Param1;
5838 uint32_t Param2;
5839 llvm::Type * Param3;
5840 llvm::Type * Param4;
5841 switch (BuiltinID) {
5842 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s16:
5843 Param0 = 1;
5844 Param1 = 1;
5845 Param2 = 0;
5846 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5847 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5848 break;
5849 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s32:
5850 Param0 = 1;
5851 Param1 = 1;
5852 Param2 = 0;
5853 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5854 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5855 break;
5856 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_s8:
5857 Param0 = 1;
5858 Param1 = 1;
5859 Param2 = 0;
5860 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5861 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5862 break;
5863 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u16:
5864 Param0 = 1;
5865 Param1 = 1;
5866 Param2 = 1;
5867 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5868 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5869 break;
5870 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u32:
5871 Param0 = 1;
5872 Param1 = 1;
5873 Param2 = 1;
5874 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5875 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5876 break;
5877 case ARM::BI__builtin_arm_mve_vqrshlq_m_n_u8:
5878 Param0 = 1;
5879 Param1 = 1;
5880 Param2 = 1;
5881 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5882 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5883 break;
5884 case ARM::BI__builtin_arm_mve_vqshlq_m_r_s16:
5885 Param0 = 1;
5886 Param1 = 0;
5887 Param2 = 0;
5888 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5889 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5890 break;
5891 case ARM::BI__builtin_arm_mve_vqshlq_m_r_s32:
5892 Param0 = 1;
5893 Param1 = 0;
5894 Param2 = 0;
5895 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5896 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5897 break;
5898 case ARM::BI__builtin_arm_mve_vqshlq_m_r_s8:
5899 Param0 = 1;
5900 Param1 = 0;
5901 Param2 = 0;
5902 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5903 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5904 break;
5905 case ARM::BI__builtin_arm_mve_vqshlq_m_r_u16:
5906 Param0 = 1;
5907 Param1 = 0;
5908 Param2 = 1;
5909 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5910 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5911 break;
5912 case ARM::BI__builtin_arm_mve_vqshlq_m_r_u32:
5913 Param0 = 1;
5914 Param1 = 0;
5915 Param2 = 1;
5916 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5917 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5918 break;
5919 case ARM::BI__builtin_arm_mve_vqshlq_m_r_u8:
5920 Param0 = 1;
5921 Param1 = 0;
5922 Param2 = 1;
5923 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5924 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5925 break;
5926 case ARM::BI__builtin_arm_mve_vrshlq_m_n_s16:
5927 Param0 = 0;
5928 Param1 = 1;
5929 Param2 = 0;
5930 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5931 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5932 break;
5933 case ARM::BI__builtin_arm_mve_vrshlq_m_n_s32:
5934 Param0 = 0;
5935 Param1 = 1;
5936 Param2 = 0;
5937 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5938 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5939 break;
5940 case ARM::BI__builtin_arm_mve_vrshlq_m_n_s8:
5941 Param0 = 0;
5942 Param1 = 1;
5943 Param2 = 0;
5944 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5945 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5946 break;
5947 case ARM::BI__builtin_arm_mve_vrshlq_m_n_u16:
5948 Param0 = 0;
5949 Param1 = 1;
5950 Param2 = 1;
5951 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5952 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5953 break;
5954 case ARM::BI__builtin_arm_mve_vrshlq_m_n_u32:
5955 Param0 = 0;
5956 Param1 = 1;
5957 Param2 = 1;
5958 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5959 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5960 break;
5961 case ARM::BI__builtin_arm_mve_vrshlq_m_n_u8:
5962 Param0 = 0;
5963 Param1 = 1;
5964 Param2 = 1;
5965 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5966 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5967 break;
5968 case ARM::BI__builtin_arm_mve_vshlq_m_r_s16:
5969 Param0 = 0;
5970 Param1 = 0;
5971 Param2 = 0;
5972 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5973 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5974 break;
5975 case ARM::BI__builtin_arm_mve_vshlq_m_r_s32:
5976 Param0 = 0;
5977 Param1 = 0;
5978 Param2 = 0;
5979 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
5980 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
5981 break;
5982 case ARM::BI__builtin_arm_mve_vshlq_m_r_s8:
5983 Param0 = 0;
5984 Param1 = 0;
5985 Param2 = 0;
5986 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
5987 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
5988 break;
5989 case ARM::BI__builtin_arm_mve_vshlq_m_r_u16:
5990 Param0 = 0;
5991 Param1 = 0;
5992 Param2 = 1;
5993 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
5994 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
5995 break;
5996 case ARM::BI__builtin_arm_mve_vshlq_m_r_u32:
5997 Param0 = 0;
5998 Param1 = 0;
5999 Param2 = 1;
6000 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
6001 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6002 break;
6003 case ARM::BI__builtin_arm_mve_vshlq_m_r_u8:
6004 Param0 = 0;
6005 Param1 = 0;
6006 Param2 = 1;
6007 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
6008 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6009 break;
6010 }
6011 Value *Val0 = EmitScalarExpr(E->getArg(0));
6012 Value *Val1 = EmitScalarExpr(E->getArg(1));
6013 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6014 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
6015 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
6016 Value *Val5 = EmitScalarExpr(E->getArg(2));
6017 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
6018 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
6019 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_scalar_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val7});
6020 }
6021 case ARM::BI__builtin_arm_mve_vqrshlq_n_s16:
6022 case ARM::BI__builtin_arm_mve_vqrshlq_n_s32:
6023 case ARM::BI__builtin_arm_mve_vqrshlq_n_s8:
6024 case ARM::BI__builtin_arm_mve_vqrshlq_n_u16:
6025 case ARM::BI__builtin_arm_mve_vqrshlq_n_u32:
6026 case ARM::BI__builtin_arm_mve_vqrshlq_n_u8:
6027 case ARM::BI__builtin_arm_mve_vqshlq_r_s16:
6028 case ARM::BI__builtin_arm_mve_vqshlq_r_s32:
6029 case ARM::BI__builtin_arm_mve_vqshlq_r_s8:
6030 case ARM::BI__builtin_arm_mve_vqshlq_r_u16:
6031 case ARM::BI__builtin_arm_mve_vqshlq_r_u32:
6032 case ARM::BI__builtin_arm_mve_vqshlq_r_u8:
6033 case ARM::BI__builtin_arm_mve_vrshlq_n_s16:
6034 case ARM::BI__builtin_arm_mve_vrshlq_n_s32:
6035 case ARM::BI__builtin_arm_mve_vrshlq_n_s8:
6036 case ARM::BI__builtin_arm_mve_vrshlq_n_u16:
6037 case ARM::BI__builtin_arm_mve_vrshlq_n_u32:
6038 case ARM::BI__builtin_arm_mve_vrshlq_n_u8:
6039 case ARM::BI__builtin_arm_mve_vshlq_r_s16:
6040 case ARM::BI__builtin_arm_mve_vshlq_r_s32:
6041 case ARM::BI__builtin_arm_mve_vshlq_r_s8:
6042 case ARM::BI__builtin_arm_mve_vshlq_r_u16:
6043 case ARM::BI__builtin_arm_mve_vshlq_r_u32:
6044 case ARM::BI__builtin_arm_mve_vshlq_r_u8: {
6045 uint32_t Param0;
6046 uint32_t Param1;
6047 uint32_t Param2;
6048 llvm::Type * Param3;
6049 switch (BuiltinID) {
6050 case ARM::BI__builtin_arm_mve_vqrshlq_n_s16:
6051 Param0 = 1;
6052 Param1 = 1;
6053 Param2 = 0;
6054 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6055 break;
6056 case ARM::BI__builtin_arm_mve_vqrshlq_n_s32:
6057 Param0 = 1;
6058 Param1 = 1;
6059 Param2 = 0;
6060 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6061 break;
6062 case ARM::BI__builtin_arm_mve_vqrshlq_n_s8:
6063 Param0 = 1;
6064 Param1 = 1;
6065 Param2 = 0;
6066 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6067 break;
6068 case ARM::BI__builtin_arm_mve_vqrshlq_n_u16:
6069 Param0 = 1;
6070 Param1 = 1;
6071 Param2 = 1;
6072 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6073 break;
6074 case ARM::BI__builtin_arm_mve_vqrshlq_n_u32:
6075 Param0 = 1;
6076 Param1 = 1;
6077 Param2 = 1;
6078 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6079 break;
6080 case ARM::BI__builtin_arm_mve_vqrshlq_n_u8:
6081 Param0 = 1;
6082 Param1 = 1;
6083 Param2 = 1;
6084 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6085 break;
6086 case ARM::BI__builtin_arm_mve_vqshlq_r_s16:
6087 Param0 = 1;
6088 Param1 = 0;
6089 Param2 = 0;
6090 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6091 break;
6092 case ARM::BI__builtin_arm_mve_vqshlq_r_s32:
6093 Param0 = 1;
6094 Param1 = 0;
6095 Param2 = 0;
6096 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6097 break;
6098 case ARM::BI__builtin_arm_mve_vqshlq_r_s8:
6099 Param0 = 1;
6100 Param1 = 0;
6101 Param2 = 0;
6102 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6103 break;
6104 case ARM::BI__builtin_arm_mve_vqshlq_r_u16:
6105 Param0 = 1;
6106 Param1 = 0;
6107 Param2 = 1;
6108 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6109 break;
6110 case ARM::BI__builtin_arm_mve_vqshlq_r_u32:
6111 Param0 = 1;
6112 Param1 = 0;
6113 Param2 = 1;
6114 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6115 break;
6116 case ARM::BI__builtin_arm_mve_vqshlq_r_u8:
6117 Param0 = 1;
6118 Param1 = 0;
6119 Param2 = 1;
6120 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6121 break;
6122 case ARM::BI__builtin_arm_mve_vrshlq_n_s16:
6123 Param0 = 0;
6124 Param1 = 1;
6125 Param2 = 0;
6126 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6127 break;
6128 case ARM::BI__builtin_arm_mve_vrshlq_n_s32:
6129 Param0 = 0;
6130 Param1 = 1;
6131 Param2 = 0;
6132 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6133 break;
6134 case ARM::BI__builtin_arm_mve_vrshlq_n_s8:
6135 Param0 = 0;
6136 Param1 = 1;
6137 Param2 = 0;
6138 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6139 break;
6140 case ARM::BI__builtin_arm_mve_vrshlq_n_u16:
6141 Param0 = 0;
6142 Param1 = 1;
6143 Param2 = 1;
6144 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6145 break;
6146 case ARM::BI__builtin_arm_mve_vrshlq_n_u32:
6147 Param0 = 0;
6148 Param1 = 1;
6149 Param2 = 1;
6150 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6151 break;
6152 case ARM::BI__builtin_arm_mve_vrshlq_n_u8:
6153 Param0 = 0;
6154 Param1 = 1;
6155 Param2 = 1;
6156 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6157 break;
6158 case ARM::BI__builtin_arm_mve_vshlq_r_s16:
6159 Param0 = 0;
6160 Param1 = 0;
6161 Param2 = 0;
6162 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6163 break;
6164 case ARM::BI__builtin_arm_mve_vshlq_r_s32:
6165 Param0 = 0;
6166 Param1 = 0;
6167 Param2 = 0;
6168 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6169 break;
6170 case ARM::BI__builtin_arm_mve_vshlq_r_s8:
6171 Param0 = 0;
6172 Param1 = 0;
6173 Param2 = 0;
6174 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6175 break;
6176 case ARM::BI__builtin_arm_mve_vshlq_r_u16:
6177 Param0 = 0;
6178 Param1 = 0;
6179 Param2 = 1;
6180 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6181 break;
6182 case ARM::BI__builtin_arm_mve_vshlq_r_u32:
6183 Param0 = 0;
6184 Param1 = 0;
6185 Param2 = 1;
6186 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6187 break;
6188 case ARM::BI__builtin_arm_mve_vshlq_r_u8:
6189 Param0 = 0;
6190 Param1 = 0;
6191 Param2 = 1;
6192 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6193 break;
6194 }
6195 Value *Val0 = EmitScalarExpr(E->getArg(0));
6196 Value *Val1 = EmitScalarExpr(E->getArg(1));
6197 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6198 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
6199 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
6200 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_scalar, {Param3}), {Val0, Val1, Val2, Val3, Val4});
6201 }
6202 case ARM::BI__builtin_arm_mve_vqmovnbq_s16:
6203 case ARM::BI__builtin_arm_mve_vqmovnbq_s32:
6204 case ARM::BI__builtin_arm_mve_vqmovnbq_u16:
6205 case ARM::BI__builtin_arm_mve_vqmovnbq_u32:
6206 case ARM::BI__builtin_arm_mve_vqmovntq_s16:
6207 case ARM::BI__builtin_arm_mve_vqmovntq_s32:
6208 case ARM::BI__builtin_arm_mve_vqmovntq_u16:
6209 case ARM::BI__builtin_arm_mve_vqmovntq_u32:
6210 case ARM::BI__builtin_arm_mve_vqmovunbq_s16:
6211 case ARM::BI__builtin_arm_mve_vqmovunbq_s32:
6212 case ARM::BI__builtin_arm_mve_vqmovuntq_s16:
6213 case ARM::BI__builtin_arm_mve_vqmovuntq_s32:
6214 case ARM::BI__builtin_arm_mve_vqrshlq_s16:
6215 case ARM::BI__builtin_arm_mve_vqrshlq_s32:
6216 case ARM::BI__builtin_arm_mve_vqrshlq_s8:
6217 case ARM::BI__builtin_arm_mve_vqrshlq_u16:
6218 case ARM::BI__builtin_arm_mve_vqrshlq_u32:
6219 case ARM::BI__builtin_arm_mve_vqrshlq_u8:
6220 case ARM::BI__builtin_arm_mve_vqshlq_s16:
6221 case ARM::BI__builtin_arm_mve_vqshlq_s32:
6222 case ARM::BI__builtin_arm_mve_vqshlq_s8:
6223 case ARM::BI__builtin_arm_mve_vqshlq_u16:
6224 case ARM::BI__builtin_arm_mve_vqshlq_u32:
6225 case ARM::BI__builtin_arm_mve_vqshlq_u8:
6226 case ARM::BI__builtin_arm_mve_vrshlq_s16:
6227 case ARM::BI__builtin_arm_mve_vrshlq_s32:
6228 case ARM::BI__builtin_arm_mve_vrshlq_s8:
6229 case ARM::BI__builtin_arm_mve_vrshlq_u16:
6230 case ARM::BI__builtin_arm_mve_vrshlq_u32:
6231 case ARM::BI__builtin_arm_mve_vrshlq_u8:
6232 case ARM::BI__builtin_arm_mve_vshlq_s16:
6233 case ARM::BI__builtin_arm_mve_vshlq_s32:
6234 case ARM::BI__builtin_arm_mve_vshlq_s8:
6235 case ARM::BI__builtin_arm_mve_vshlq_u16:
6236 case ARM::BI__builtin_arm_mve_vshlq_u32:
6237 case ARM::BI__builtin_arm_mve_vshlq_u8: {
6238 uint32_t Param0;
6239 uint32_t Param1;
6240 uint32_t Param2;
6241 Intrinsic::ID Param3;
6242 llvm::Type * Param4;
6243 llvm::Type * Param5;
6244 switch (BuiltinID) {
6245 case ARM::BI__builtin_arm_mve_vqmovnbq_s16:
6246 Param0 = 0;
6247 Param1 = 0;
6248 Param2 = 0;
6249 Param3 = Intrinsic::arm_mve_vqmovn;
6250 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6251 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6252 break;
6253 case ARM::BI__builtin_arm_mve_vqmovnbq_s32:
6254 Param0 = 0;
6255 Param1 = 0;
6256 Param2 = 0;
6257 Param3 = Intrinsic::arm_mve_vqmovn;
6258 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6259 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6260 break;
6261 case ARM::BI__builtin_arm_mve_vqmovnbq_u16:
6262 Param0 = 1;
6263 Param1 = 1;
6264 Param2 = 0;
6265 Param3 = Intrinsic::arm_mve_vqmovn;
6266 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6267 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6268 break;
6269 case ARM::BI__builtin_arm_mve_vqmovnbq_u32:
6270 Param0 = 1;
6271 Param1 = 1;
6272 Param2 = 0;
6273 Param3 = Intrinsic::arm_mve_vqmovn;
6274 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6275 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6276 break;
6277 case ARM::BI__builtin_arm_mve_vqmovntq_s16:
6278 Param0 = 0;
6279 Param1 = 0;
6280 Param2 = 1;
6281 Param3 = Intrinsic::arm_mve_vqmovn;
6282 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6283 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6284 break;
6285 case ARM::BI__builtin_arm_mve_vqmovntq_s32:
6286 Param0 = 0;
6287 Param1 = 0;
6288 Param2 = 1;
6289 Param3 = Intrinsic::arm_mve_vqmovn;
6290 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6291 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6292 break;
6293 case ARM::BI__builtin_arm_mve_vqmovntq_u16:
6294 Param0 = 1;
6295 Param1 = 1;
6296 Param2 = 1;
6297 Param3 = Intrinsic::arm_mve_vqmovn;
6298 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6299 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6300 break;
6301 case ARM::BI__builtin_arm_mve_vqmovntq_u32:
6302 Param0 = 1;
6303 Param1 = 1;
6304 Param2 = 1;
6305 Param3 = Intrinsic::arm_mve_vqmovn;
6306 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6307 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6308 break;
6309 case ARM::BI__builtin_arm_mve_vqmovunbq_s16:
6310 Param0 = 1;
6311 Param1 = 0;
6312 Param2 = 0;
6313 Param3 = Intrinsic::arm_mve_vqmovn;
6314 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6315 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6316 break;
6317 case ARM::BI__builtin_arm_mve_vqmovunbq_s32:
6318 Param0 = 1;
6319 Param1 = 0;
6320 Param2 = 0;
6321 Param3 = Intrinsic::arm_mve_vqmovn;
6322 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6323 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6324 break;
6325 case ARM::BI__builtin_arm_mve_vqmovuntq_s16:
6326 Param0 = 1;
6327 Param1 = 0;
6328 Param2 = 1;
6329 Param3 = Intrinsic::arm_mve_vqmovn;
6330 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6331 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6332 break;
6333 case ARM::BI__builtin_arm_mve_vqmovuntq_s32:
6334 Param0 = 1;
6335 Param1 = 0;
6336 Param2 = 1;
6337 Param3 = Intrinsic::arm_mve_vqmovn;
6338 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6339 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6340 break;
6341 case ARM::BI__builtin_arm_mve_vqrshlq_s16:
6342 Param0 = 1;
6343 Param1 = 1;
6344 Param2 = 0;
6345 Param3 = Intrinsic::arm_mve_vshl_vector;
6346 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6347 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6348 break;
6349 case ARM::BI__builtin_arm_mve_vqrshlq_s32:
6350 Param0 = 1;
6351 Param1 = 1;
6352 Param2 = 0;
6353 Param3 = Intrinsic::arm_mve_vshl_vector;
6354 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6355 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6356 break;
6357 case ARM::BI__builtin_arm_mve_vqrshlq_s8:
6358 Param0 = 1;
6359 Param1 = 1;
6360 Param2 = 0;
6361 Param3 = Intrinsic::arm_mve_vshl_vector;
6362 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6363 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6364 break;
6365 case ARM::BI__builtin_arm_mve_vqrshlq_u16:
6366 Param0 = 1;
6367 Param1 = 1;
6368 Param2 = 1;
6369 Param3 = Intrinsic::arm_mve_vshl_vector;
6370 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6371 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6372 break;
6373 case ARM::BI__builtin_arm_mve_vqrshlq_u32:
6374 Param0 = 1;
6375 Param1 = 1;
6376 Param2 = 1;
6377 Param3 = Intrinsic::arm_mve_vshl_vector;
6378 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6379 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6380 break;
6381 case ARM::BI__builtin_arm_mve_vqrshlq_u8:
6382 Param0 = 1;
6383 Param1 = 1;
6384 Param2 = 1;
6385 Param3 = Intrinsic::arm_mve_vshl_vector;
6386 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6387 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6388 break;
6389 case ARM::BI__builtin_arm_mve_vqshlq_s16:
6390 Param0 = 1;
6391 Param1 = 0;
6392 Param2 = 0;
6393 Param3 = Intrinsic::arm_mve_vshl_vector;
6394 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6395 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6396 break;
6397 case ARM::BI__builtin_arm_mve_vqshlq_s32:
6398 Param0 = 1;
6399 Param1 = 0;
6400 Param2 = 0;
6401 Param3 = Intrinsic::arm_mve_vshl_vector;
6402 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6403 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6404 break;
6405 case ARM::BI__builtin_arm_mve_vqshlq_s8:
6406 Param0 = 1;
6407 Param1 = 0;
6408 Param2 = 0;
6409 Param3 = Intrinsic::arm_mve_vshl_vector;
6410 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6411 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6412 break;
6413 case ARM::BI__builtin_arm_mve_vqshlq_u16:
6414 Param0 = 1;
6415 Param1 = 0;
6416 Param2 = 1;
6417 Param3 = Intrinsic::arm_mve_vshl_vector;
6418 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6419 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6420 break;
6421 case ARM::BI__builtin_arm_mve_vqshlq_u32:
6422 Param0 = 1;
6423 Param1 = 0;
6424 Param2 = 1;
6425 Param3 = Intrinsic::arm_mve_vshl_vector;
6426 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6427 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6428 break;
6429 case ARM::BI__builtin_arm_mve_vqshlq_u8:
6430 Param0 = 1;
6431 Param1 = 0;
6432 Param2 = 1;
6433 Param3 = Intrinsic::arm_mve_vshl_vector;
6434 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6435 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6436 break;
6437 case ARM::BI__builtin_arm_mve_vrshlq_s16:
6438 Param0 = 0;
6439 Param1 = 1;
6440 Param2 = 0;
6441 Param3 = Intrinsic::arm_mve_vshl_vector;
6442 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6443 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6444 break;
6445 case ARM::BI__builtin_arm_mve_vrshlq_s32:
6446 Param0 = 0;
6447 Param1 = 1;
6448 Param2 = 0;
6449 Param3 = Intrinsic::arm_mve_vshl_vector;
6450 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6451 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6452 break;
6453 case ARM::BI__builtin_arm_mve_vrshlq_s8:
6454 Param0 = 0;
6455 Param1 = 1;
6456 Param2 = 0;
6457 Param3 = Intrinsic::arm_mve_vshl_vector;
6458 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6459 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6460 break;
6461 case ARM::BI__builtin_arm_mve_vrshlq_u16:
6462 Param0 = 0;
6463 Param1 = 1;
6464 Param2 = 1;
6465 Param3 = Intrinsic::arm_mve_vshl_vector;
6466 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6467 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6468 break;
6469 case ARM::BI__builtin_arm_mve_vrshlq_u32:
6470 Param0 = 0;
6471 Param1 = 1;
6472 Param2 = 1;
6473 Param3 = Intrinsic::arm_mve_vshl_vector;
6474 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6475 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6476 break;
6477 case ARM::BI__builtin_arm_mve_vrshlq_u8:
6478 Param0 = 0;
6479 Param1 = 1;
6480 Param2 = 1;
6481 Param3 = Intrinsic::arm_mve_vshl_vector;
6482 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6483 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6484 break;
6485 case ARM::BI__builtin_arm_mve_vshlq_s16:
6486 Param0 = 0;
6487 Param1 = 0;
6488 Param2 = 0;
6489 Param3 = Intrinsic::arm_mve_vshl_vector;
6490 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6491 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6492 break;
6493 case ARM::BI__builtin_arm_mve_vshlq_s32:
6494 Param0 = 0;
6495 Param1 = 0;
6496 Param2 = 0;
6497 Param3 = Intrinsic::arm_mve_vshl_vector;
6498 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6499 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6500 break;
6501 case ARM::BI__builtin_arm_mve_vshlq_s8:
6502 Param0 = 0;
6503 Param1 = 0;
6504 Param2 = 0;
6505 Param3 = Intrinsic::arm_mve_vshl_vector;
6506 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6507 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6508 break;
6509 case ARM::BI__builtin_arm_mve_vshlq_u16:
6510 Param0 = 0;
6511 Param1 = 0;
6512 Param2 = 1;
6513 Param3 = Intrinsic::arm_mve_vshl_vector;
6514 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6515 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
6516 break;
6517 case ARM::BI__builtin_arm_mve_vshlq_u32:
6518 Param0 = 0;
6519 Param1 = 0;
6520 Param2 = 1;
6521 Param3 = Intrinsic::arm_mve_vshl_vector;
6522 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6523 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
6524 break;
6525 case ARM::BI__builtin_arm_mve_vshlq_u8:
6526 Param0 = 0;
6527 Param1 = 0;
6528 Param2 = 1;
6529 Param3 = Intrinsic::arm_mve_vshl_vector;
6530 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6531 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
6532 break;
6533 }
6534 Value *Val0 = EmitScalarExpr(E->getArg(0));
6535 Value *Val1 = EmitScalarExpr(E->getArg(1));
6536 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6537 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
6538 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
6539 return Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4, Param5}), {Val0, Val1, Val2, Val3, Val4});
6540 }
6541 case ARM::BI__builtin_arm_mve_vmullbq_int_s16:
6542 case ARM::BI__builtin_arm_mve_vmullbq_int_s32:
6543 case ARM::BI__builtin_arm_mve_vmullbq_int_s8:
6544 case ARM::BI__builtin_arm_mve_vmullbq_int_u16:
6545 case ARM::BI__builtin_arm_mve_vmullbq_int_u32:
6546 case ARM::BI__builtin_arm_mve_vmullbq_int_u8:
6547 case ARM::BI__builtin_arm_mve_vmulltq_int_s16:
6548 case ARM::BI__builtin_arm_mve_vmulltq_int_s32:
6549 case ARM::BI__builtin_arm_mve_vmulltq_int_s8:
6550 case ARM::BI__builtin_arm_mve_vmulltq_int_u16:
6551 case ARM::BI__builtin_arm_mve_vmulltq_int_u32:
6552 case ARM::BI__builtin_arm_mve_vmulltq_int_u8:
6553 case ARM::BI__builtin_arm_mve_vshllbq_n_s16:
6554 case ARM::BI__builtin_arm_mve_vshllbq_n_s8:
6555 case ARM::BI__builtin_arm_mve_vshllbq_n_u16:
6556 case ARM::BI__builtin_arm_mve_vshllbq_n_u8:
6557 case ARM::BI__builtin_arm_mve_vshlltq_n_s16:
6558 case ARM::BI__builtin_arm_mve_vshlltq_n_s8:
6559 case ARM::BI__builtin_arm_mve_vshlltq_n_u16:
6560 case ARM::BI__builtin_arm_mve_vshlltq_n_u8: {
6561 uint32_t Param0;
6562 uint32_t Param1;
6563 Intrinsic::ID Param2;
6564 llvm::Type * Param3;
6565 llvm::Type * Param4;
6566 switch (BuiltinID) {
6567 case ARM::BI__builtin_arm_mve_vmullbq_int_s16:
6568 Param0 = 0;
6569 Param1 = 0;
6570 Param2 = Intrinsic::arm_mve_vmull;
6571 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6572 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6573 break;
6574 case ARM::BI__builtin_arm_mve_vmullbq_int_s32:
6575 Param0 = 0;
6576 Param1 = 0;
6577 Param2 = Intrinsic::arm_mve_vmull;
6578 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
6579 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6580 break;
6581 case ARM::BI__builtin_arm_mve_vmullbq_int_s8:
6582 Param0 = 0;
6583 Param1 = 0;
6584 Param2 = Intrinsic::arm_mve_vmull;
6585 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6586 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6587 break;
6588 case ARM::BI__builtin_arm_mve_vmullbq_int_u16:
6589 Param0 = 1;
6590 Param1 = 0;
6591 Param2 = Intrinsic::arm_mve_vmull;
6592 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6593 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6594 break;
6595 case ARM::BI__builtin_arm_mve_vmullbq_int_u32:
6596 Param0 = 1;
6597 Param1 = 0;
6598 Param2 = Intrinsic::arm_mve_vmull;
6599 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
6600 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6601 break;
6602 case ARM::BI__builtin_arm_mve_vmullbq_int_u8:
6603 Param0 = 1;
6604 Param1 = 0;
6605 Param2 = Intrinsic::arm_mve_vmull;
6606 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6607 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6608 break;
6609 case ARM::BI__builtin_arm_mve_vmulltq_int_s16:
6610 Param0 = 0;
6611 Param1 = 1;
6612 Param2 = Intrinsic::arm_mve_vmull;
6613 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6614 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6615 break;
6616 case ARM::BI__builtin_arm_mve_vmulltq_int_s32:
6617 Param0 = 0;
6618 Param1 = 1;
6619 Param2 = Intrinsic::arm_mve_vmull;
6620 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
6621 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6622 break;
6623 case ARM::BI__builtin_arm_mve_vmulltq_int_s8:
6624 Param0 = 0;
6625 Param1 = 1;
6626 Param2 = Intrinsic::arm_mve_vmull;
6627 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6628 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6629 break;
6630 case ARM::BI__builtin_arm_mve_vmulltq_int_u16:
6631 Param0 = 1;
6632 Param1 = 1;
6633 Param2 = Intrinsic::arm_mve_vmull;
6634 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6635 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6636 break;
6637 case ARM::BI__builtin_arm_mve_vmulltq_int_u32:
6638 Param0 = 1;
6639 Param1 = 1;
6640 Param2 = Intrinsic::arm_mve_vmull;
6641 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
6642 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
6643 break;
6644 case ARM::BI__builtin_arm_mve_vmulltq_int_u8:
6645 Param0 = 1;
6646 Param1 = 1;
6647 Param2 = Intrinsic::arm_mve_vmull;
6648 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6649 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6650 break;
6651 case ARM::BI__builtin_arm_mve_vshllbq_n_s16:
6652 Param0 = 0;
6653 Param1 = 0;
6654 Param2 = Intrinsic::arm_mve_vshll_imm;
6655 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6656 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6657 break;
6658 case ARM::BI__builtin_arm_mve_vshllbq_n_s8:
6659 Param0 = 0;
6660 Param1 = 0;
6661 Param2 = Intrinsic::arm_mve_vshll_imm;
6662 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6663 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6664 break;
6665 case ARM::BI__builtin_arm_mve_vshllbq_n_u16:
6666 Param0 = 1;
6667 Param1 = 0;
6668 Param2 = Intrinsic::arm_mve_vshll_imm;
6669 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6670 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6671 break;
6672 case ARM::BI__builtin_arm_mve_vshllbq_n_u8:
6673 Param0 = 1;
6674 Param1 = 0;
6675 Param2 = Intrinsic::arm_mve_vshll_imm;
6676 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6677 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6678 break;
6679 case ARM::BI__builtin_arm_mve_vshlltq_n_s16:
6680 Param0 = 0;
6681 Param1 = 1;
6682 Param2 = Intrinsic::arm_mve_vshll_imm;
6683 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6684 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6685 break;
6686 case ARM::BI__builtin_arm_mve_vshlltq_n_s8:
6687 Param0 = 0;
6688 Param1 = 1;
6689 Param2 = Intrinsic::arm_mve_vshll_imm;
6690 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6691 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6692 break;
6693 case ARM::BI__builtin_arm_mve_vshlltq_n_u16:
6694 Param0 = 1;
6695 Param1 = 1;
6696 Param2 = Intrinsic::arm_mve_vshll_imm;
6697 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6698 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
6699 break;
6700 case ARM::BI__builtin_arm_mve_vshlltq_n_u8:
6701 Param0 = 1;
6702 Param1 = 1;
6703 Param2 = Intrinsic::arm_mve_vshll_imm;
6704 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6705 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
6706 break;
6707 }
6708 Value *Val0 = EmitScalarExpr(E->getArg(0));
6709 Value *Val1 = EmitScalarExpr(E->getArg(1));
6710 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6711 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
6712 return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param4}), {Val0, Val1, Val2, Val3});
6713 }
6714 case ARM::BI__builtin_arm_mve_vcvtbq_f16_f32:
6715 case ARM::BI__builtin_arm_mve_vcvttq_f16_f32: {
6716 uint32_t Param0;
6717 switch (BuiltinID) {
6718 case ARM::BI__builtin_arm_mve_vcvtbq_f16_f32:
6719 Param0 = 0;
6720 break;
6721 case ARM::BI__builtin_arm_mve_vcvttq_f16_f32:
6722 Param0 = 1;
6723 break;
6724 }
6725 Value *Val0 = EmitScalarExpr(E->getArg(0));
6726 Value *Val1 = EmitScalarExpr(E->getArg(1));
6727 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6728 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_narrow), {Val0, Val1, Val2});
6729 }
6730 case ARM::BI__builtin_arm_mve_vmullbq_poly_p16:
6731 case ARM::BI__builtin_arm_mve_vmullbq_poly_p8:
6732 case ARM::BI__builtin_arm_mve_vmulltq_poly_p16:
6733 case ARM::BI__builtin_arm_mve_vmulltq_poly_p8:
6734 case ARM::BI__builtin_arm_mve_vqdmullbq_s16:
6735 case ARM::BI__builtin_arm_mve_vqdmullbq_s32:
6736 case ARM::BI__builtin_arm_mve_vqdmulltq_s16:
6737 case ARM::BI__builtin_arm_mve_vqdmulltq_s32: {
6738 uint32_t Param0;
6739 Intrinsic::ID Param1;
6740 llvm::Type * Param2;
6741 llvm::Type * Param3;
6742 switch (BuiltinID) {
6743 case ARM::BI__builtin_arm_mve_vmullbq_poly_p16:
6744 Param0 = 0;
6745 Param1 = Intrinsic::arm_mve_vmull_poly;
6746 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6747 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6748 break;
6749 case ARM::BI__builtin_arm_mve_vmullbq_poly_p8:
6750 Param0 = 0;
6751 Param1 = Intrinsic::arm_mve_vmull_poly;
6752 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6753 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6754 break;
6755 case ARM::BI__builtin_arm_mve_vmulltq_poly_p16:
6756 Param0 = 1;
6757 Param1 = Intrinsic::arm_mve_vmull_poly;
6758 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6759 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6760 break;
6761 case ARM::BI__builtin_arm_mve_vmulltq_poly_p8:
6762 Param0 = 1;
6763 Param1 = Intrinsic::arm_mve_vmull_poly;
6764 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6765 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
6766 break;
6767 case ARM::BI__builtin_arm_mve_vqdmullbq_s16:
6768 Param0 = 0;
6769 Param1 = Intrinsic::arm_mve_vqdmull;
6770 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6771 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6772 break;
6773 case ARM::BI__builtin_arm_mve_vqdmullbq_s32:
6774 Param0 = 0;
6775 Param1 = Intrinsic::arm_mve_vqdmull;
6776 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
6777 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6778 break;
6779 case ARM::BI__builtin_arm_mve_vqdmulltq_s16:
6780 Param0 = 1;
6781 Param1 = Intrinsic::arm_mve_vqdmull;
6782 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6783 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
6784 break;
6785 case ARM::BI__builtin_arm_mve_vqdmulltq_s32:
6786 Param0 = 1;
6787 Param1 = Intrinsic::arm_mve_vqdmull;
6788 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
6789 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
6790 break;
6791 }
6792 Value *Val0 = EmitScalarExpr(E->getArg(0));
6793 Value *Val1 = EmitScalarExpr(E->getArg(1));
6794 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
6795 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param3}), {Val0, Val1, Val2});
6796 }
6797 case ARM::BI__builtin_arm_mve_vabdq_f16:
6798 case ARM::BI__builtin_arm_mve_vabdq_f32:
6799 case ARM::BI__builtin_arm_mve_vabdq_s16:
6800 case ARM::BI__builtin_arm_mve_vabdq_s32:
6801 case ARM::BI__builtin_arm_mve_vabdq_s8:
6802 case ARM::BI__builtin_arm_mve_vabdq_u16:
6803 case ARM::BI__builtin_arm_mve_vabdq_u32:
6804 case ARM::BI__builtin_arm_mve_vabdq_u8:
6805 case ARM::BI__builtin_arm_mve_vhaddq_s16:
6806 case ARM::BI__builtin_arm_mve_vhaddq_s32:
6807 case ARM::BI__builtin_arm_mve_vhaddq_s8:
6808 case ARM::BI__builtin_arm_mve_vhaddq_u16:
6809 case ARM::BI__builtin_arm_mve_vhaddq_u32:
6810 case ARM::BI__builtin_arm_mve_vhaddq_u8:
6811 case ARM::BI__builtin_arm_mve_vhsubq_s16:
6812 case ARM::BI__builtin_arm_mve_vhsubq_s32:
6813 case ARM::BI__builtin_arm_mve_vhsubq_s8:
6814 case ARM::BI__builtin_arm_mve_vhsubq_u16:
6815 case ARM::BI__builtin_arm_mve_vhsubq_u32:
6816 case ARM::BI__builtin_arm_mve_vhsubq_u8:
6817 case ARM::BI__builtin_arm_mve_vmulhq_s16:
6818 case ARM::BI__builtin_arm_mve_vmulhq_s32:
6819 case ARM::BI__builtin_arm_mve_vmulhq_s8:
6820 case ARM::BI__builtin_arm_mve_vmulhq_u16:
6821 case ARM::BI__builtin_arm_mve_vmulhq_u32:
6822 case ARM::BI__builtin_arm_mve_vmulhq_u8:
6823 case ARM::BI__builtin_arm_mve_vqshlq_n_s16:
6824 case ARM::BI__builtin_arm_mve_vqshlq_n_s32:
6825 case ARM::BI__builtin_arm_mve_vqshlq_n_s8:
6826 case ARM::BI__builtin_arm_mve_vqshlq_n_u16:
6827 case ARM::BI__builtin_arm_mve_vqshlq_n_u32:
6828 case ARM::BI__builtin_arm_mve_vqshlq_n_u8:
6829 case ARM::BI__builtin_arm_mve_vrhaddq_s16:
6830 case ARM::BI__builtin_arm_mve_vrhaddq_s32:
6831 case ARM::BI__builtin_arm_mve_vrhaddq_s8:
6832 case ARM::BI__builtin_arm_mve_vrhaddq_u16:
6833 case ARM::BI__builtin_arm_mve_vrhaddq_u32:
6834 case ARM::BI__builtin_arm_mve_vrhaddq_u8:
6835 case ARM::BI__builtin_arm_mve_vrmulhq_s16:
6836 case ARM::BI__builtin_arm_mve_vrmulhq_s32:
6837 case ARM::BI__builtin_arm_mve_vrmulhq_s8:
6838 case ARM::BI__builtin_arm_mve_vrmulhq_u16:
6839 case ARM::BI__builtin_arm_mve_vrmulhq_u32:
6840 case ARM::BI__builtin_arm_mve_vrmulhq_u8:
6841 case ARM::BI__builtin_arm_mve_vrshrq_n_s16:
6842 case ARM::BI__builtin_arm_mve_vrshrq_n_s32:
6843 case ARM::BI__builtin_arm_mve_vrshrq_n_s8:
6844 case ARM::BI__builtin_arm_mve_vrshrq_n_u16:
6845 case ARM::BI__builtin_arm_mve_vrshrq_n_u32:
6846 case ARM::BI__builtin_arm_mve_vrshrq_n_u8: {
6847 uint32_t Param0;
6848 Intrinsic::ID Param1;
6849 llvm::Type * Param2;
6850 switch (BuiltinID) {
6851 case ARM::BI__builtin_arm_mve_vabdq_f16:
6852 Param0 = 0;
6853 Param1 = Intrinsic::arm_mve_vabd;
6854 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
6855 break;
6856 case ARM::BI__builtin_arm_mve_vabdq_f32:
6857 Param0 = 0;
6858 Param1 = Intrinsic::arm_mve_vabd;
6859 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
6860 break;
6861 case ARM::BI__builtin_arm_mve_vabdq_s16:
6862 Param0 = 0;
6863 Param1 = Intrinsic::arm_mve_vabd;
6864 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6865 break;
6866 case ARM::BI__builtin_arm_mve_vabdq_s32:
6867 Param0 = 0;
6868 Param1 = Intrinsic::arm_mve_vabd;
6869 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6870 break;
6871 case ARM::BI__builtin_arm_mve_vabdq_s8:
6872 Param0 = 0;
6873 Param1 = Intrinsic::arm_mve_vabd;
6874 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6875 break;
6876 case ARM::BI__builtin_arm_mve_vabdq_u16:
6877 Param0 = 1;
6878 Param1 = Intrinsic::arm_mve_vabd;
6879 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6880 break;
6881 case ARM::BI__builtin_arm_mve_vabdq_u32:
6882 Param0 = 1;
6883 Param1 = Intrinsic::arm_mve_vabd;
6884 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6885 break;
6886 case ARM::BI__builtin_arm_mve_vabdq_u8:
6887 Param0 = 1;
6888 Param1 = Intrinsic::arm_mve_vabd;
6889 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6890 break;
6891 case ARM::BI__builtin_arm_mve_vhaddq_s16:
6892 Param0 = 0;
6893 Param1 = Intrinsic::arm_mve_vhadd;
6894 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6895 break;
6896 case ARM::BI__builtin_arm_mve_vhaddq_s32:
6897 Param0 = 0;
6898 Param1 = Intrinsic::arm_mve_vhadd;
6899 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6900 break;
6901 case ARM::BI__builtin_arm_mve_vhaddq_s8:
6902 Param0 = 0;
6903 Param1 = Intrinsic::arm_mve_vhadd;
6904 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6905 break;
6906 case ARM::BI__builtin_arm_mve_vhaddq_u16:
6907 Param0 = 1;
6908 Param1 = Intrinsic::arm_mve_vhadd;
6909 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6910 break;
6911 case ARM::BI__builtin_arm_mve_vhaddq_u32:
6912 Param0 = 1;
6913 Param1 = Intrinsic::arm_mve_vhadd;
6914 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6915 break;
6916 case ARM::BI__builtin_arm_mve_vhaddq_u8:
6917 Param0 = 1;
6918 Param1 = Intrinsic::arm_mve_vhadd;
6919 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6920 break;
6921 case ARM::BI__builtin_arm_mve_vhsubq_s16:
6922 Param0 = 0;
6923 Param1 = Intrinsic::arm_mve_vhsub;
6924 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6925 break;
6926 case ARM::BI__builtin_arm_mve_vhsubq_s32:
6927 Param0 = 0;
6928 Param1 = Intrinsic::arm_mve_vhsub;
6929 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6930 break;
6931 case ARM::BI__builtin_arm_mve_vhsubq_s8:
6932 Param0 = 0;
6933 Param1 = Intrinsic::arm_mve_vhsub;
6934 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6935 break;
6936 case ARM::BI__builtin_arm_mve_vhsubq_u16:
6937 Param0 = 1;
6938 Param1 = Intrinsic::arm_mve_vhsub;
6939 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6940 break;
6941 case ARM::BI__builtin_arm_mve_vhsubq_u32:
6942 Param0 = 1;
6943 Param1 = Intrinsic::arm_mve_vhsub;
6944 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6945 break;
6946 case ARM::BI__builtin_arm_mve_vhsubq_u8:
6947 Param0 = 1;
6948 Param1 = Intrinsic::arm_mve_vhsub;
6949 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6950 break;
6951 case ARM::BI__builtin_arm_mve_vmulhq_s16:
6952 Param0 = 0;
6953 Param1 = Intrinsic::arm_mve_vmulh;
6954 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6955 break;
6956 case ARM::BI__builtin_arm_mve_vmulhq_s32:
6957 Param0 = 0;
6958 Param1 = Intrinsic::arm_mve_vmulh;
6959 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6960 break;
6961 case ARM::BI__builtin_arm_mve_vmulhq_s8:
6962 Param0 = 0;
6963 Param1 = Intrinsic::arm_mve_vmulh;
6964 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6965 break;
6966 case ARM::BI__builtin_arm_mve_vmulhq_u16:
6967 Param0 = 1;
6968 Param1 = Intrinsic::arm_mve_vmulh;
6969 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6970 break;
6971 case ARM::BI__builtin_arm_mve_vmulhq_u32:
6972 Param0 = 1;
6973 Param1 = Intrinsic::arm_mve_vmulh;
6974 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6975 break;
6976 case ARM::BI__builtin_arm_mve_vmulhq_u8:
6977 Param0 = 1;
6978 Param1 = Intrinsic::arm_mve_vmulh;
6979 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6980 break;
6981 case ARM::BI__builtin_arm_mve_vqshlq_n_s16:
6982 Param0 = 0;
6983 Param1 = Intrinsic::arm_mve_vqshl_imm;
6984 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
6985 break;
6986 case ARM::BI__builtin_arm_mve_vqshlq_n_s32:
6987 Param0 = 0;
6988 Param1 = Intrinsic::arm_mve_vqshl_imm;
6989 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
6990 break;
6991 case ARM::BI__builtin_arm_mve_vqshlq_n_s8:
6992 Param0 = 0;
6993 Param1 = Intrinsic::arm_mve_vqshl_imm;
6994 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
6995 break;
6996 case ARM::BI__builtin_arm_mve_vqshlq_n_u16:
6997 Param0 = 1;
6998 Param1 = Intrinsic::arm_mve_vqshl_imm;
6999 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7000 break;
7001 case ARM::BI__builtin_arm_mve_vqshlq_n_u32:
7002 Param0 = 1;
7003 Param1 = Intrinsic::arm_mve_vqshl_imm;
7004 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7005 break;
7006 case ARM::BI__builtin_arm_mve_vqshlq_n_u8:
7007 Param0 = 1;
7008 Param1 = Intrinsic::arm_mve_vqshl_imm;
7009 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7010 break;
7011 case ARM::BI__builtin_arm_mve_vrhaddq_s16:
7012 Param0 = 0;
7013 Param1 = Intrinsic::arm_mve_vrhadd;
7014 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7015 break;
7016 case ARM::BI__builtin_arm_mve_vrhaddq_s32:
7017 Param0 = 0;
7018 Param1 = Intrinsic::arm_mve_vrhadd;
7019 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7020 break;
7021 case ARM::BI__builtin_arm_mve_vrhaddq_s8:
7022 Param0 = 0;
7023 Param1 = Intrinsic::arm_mve_vrhadd;
7024 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7025 break;
7026 case ARM::BI__builtin_arm_mve_vrhaddq_u16:
7027 Param0 = 1;
7028 Param1 = Intrinsic::arm_mve_vrhadd;
7029 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7030 break;
7031 case ARM::BI__builtin_arm_mve_vrhaddq_u32:
7032 Param0 = 1;
7033 Param1 = Intrinsic::arm_mve_vrhadd;
7034 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7035 break;
7036 case ARM::BI__builtin_arm_mve_vrhaddq_u8:
7037 Param0 = 1;
7038 Param1 = Intrinsic::arm_mve_vrhadd;
7039 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7040 break;
7041 case ARM::BI__builtin_arm_mve_vrmulhq_s16:
7042 Param0 = 0;
7043 Param1 = Intrinsic::arm_mve_vrmulh;
7044 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7045 break;
7046 case ARM::BI__builtin_arm_mve_vrmulhq_s32:
7047 Param0 = 0;
7048 Param1 = Intrinsic::arm_mve_vrmulh;
7049 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7050 break;
7051 case ARM::BI__builtin_arm_mve_vrmulhq_s8:
7052 Param0 = 0;
7053 Param1 = Intrinsic::arm_mve_vrmulh;
7054 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7055 break;
7056 case ARM::BI__builtin_arm_mve_vrmulhq_u16:
7057 Param0 = 1;
7058 Param1 = Intrinsic::arm_mve_vrmulh;
7059 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7060 break;
7061 case ARM::BI__builtin_arm_mve_vrmulhq_u32:
7062 Param0 = 1;
7063 Param1 = Intrinsic::arm_mve_vrmulh;
7064 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7065 break;
7066 case ARM::BI__builtin_arm_mve_vrmulhq_u8:
7067 Param0 = 1;
7068 Param1 = Intrinsic::arm_mve_vrmulh;
7069 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7070 break;
7071 case ARM::BI__builtin_arm_mve_vrshrq_n_s16:
7072 Param0 = 0;
7073 Param1 = Intrinsic::arm_mve_vrshr_imm;
7074 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7075 break;
7076 case ARM::BI__builtin_arm_mve_vrshrq_n_s32:
7077 Param0 = 0;
7078 Param1 = Intrinsic::arm_mve_vrshr_imm;
7079 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7080 break;
7081 case ARM::BI__builtin_arm_mve_vrshrq_n_s8:
7082 Param0 = 0;
7083 Param1 = Intrinsic::arm_mve_vrshr_imm;
7084 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7085 break;
7086 case ARM::BI__builtin_arm_mve_vrshrq_n_u16:
7087 Param0 = 1;
7088 Param1 = Intrinsic::arm_mve_vrshr_imm;
7089 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7090 break;
7091 case ARM::BI__builtin_arm_mve_vrshrq_n_u32:
7092 Param0 = 1;
7093 Param1 = Intrinsic::arm_mve_vrshr_imm;
7094 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7095 break;
7096 case ARM::BI__builtin_arm_mve_vrshrq_n_u8:
7097 Param0 = 1;
7098 Param1 = Intrinsic::arm_mve_vrshr_imm;
7099 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7100 break;
7101 }
7102 Value *Val0 = EmitScalarExpr(E->getArg(0));
7103 Value *Val1 = EmitScalarExpr(E->getArg(1));
7104 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
7105 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1, Val2});
7106 }
7107 case ARM::BI__builtin_arm_mve_vaddq_s16:
7108 case ARM::BI__builtin_arm_mve_vaddq_s32:
7109 case ARM::BI__builtin_arm_mve_vaddq_s8:
7110 case ARM::BI__builtin_arm_mve_vaddq_u16:
7111 case ARM::BI__builtin_arm_mve_vaddq_u32:
7112 case ARM::BI__builtin_arm_mve_vaddq_u8: {
7113 Value *Val0 = EmitScalarExpr(E->getArg(0));
7114 Value *Val1 = EmitScalarExpr(E->getArg(1));
7115 return Builder.CreateAdd(Val0, Val1);
7116 }
7117 case ARM::BI__builtin_arm_mve_vandq_s16:
7118 case ARM::BI__builtin_arm_mve_vandq_s32:
7119 case ARM::BI__builtin_arm_mve_vandq_s8:
7120 case ARM::BI__builtin_arm_mve_vandq_u16:
7121 case ARM::BI__builtin_arm_mve_vandq_u32:
7122 case ARM::BI__builtin_arm_mve_vandq_u8: {
7123 Value *Val0 = EmitScalarExpr(E->getArg(0));
7124 Value *Val1 = EmitScalarExpr(E->getArg(1));
7125 return Builder.CreateAnd(Val0, Val1);
7126 }
7127 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_s64:
7128 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_u64:
7129 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_f32:
7130 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_s32:
7131 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_u32: {
7132 llvm::Type * Param0;
7133 llvm::Type * Param1;
7134 switch (BuiltinID) {
7135 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_s64:
7136 Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
7137 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
7138 break;
7139 case ARM::BI__builtin_arm_mve_vldrdq_gather_base_u64:
7140 Param0 = llvm::FixedVectorType::get(Int64Ty, 2);
7141 Param1 = llvm::FixedVectorType::get(Int64Ty, 2);
7142 break;
7143 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_f32:
7144 Param0 = llvm::FixedVectorType::get(FloatTy, 4);
7145 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7146 break;
7147 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_s32:
7148 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
7149 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7150 break;
7151 case ARM::BI__builtin_arm_mve_vldrwq_gather_base_u32:
7152 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
7153 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7154 break;
7155 }
7156 Value *Val0 = EmitScalarExpr(E->getArg(0));
7157 Value *Val1 = EmitScalarExpr(E->getArg(1));
7158 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vldr_gather_base, {Param0, Param1}), {Val0, Val1});
7159 }
7160 case ARM::BI__builtin_arm_mve_sqrshr:
7161 case ARM::BI__builtin_arm_mve_sqshl:
7162 case ARM::BI__builtin_arm_mve_srshr:
7163 case ARM::BI__builtin_arm_mve_uqrshl:
7164 case ARM::BI__builtin_arm_mve_uqshl:
7165 case ARM::BI__builtin_arm_mve_urshr: {
7166 Intrinsic::ID Param0;
7167 switch (BuiltinID) {
7168 case ARM::BI__builtin_arm_mve_sqrshr:
7169 Param0 = Intrinsic::arm_mve_sqrshr;
7170 break;
7171 case ARM::BI__builtin_arm_mve_sqshl:
7172 Param0 = Intrinsic::arm_mve_sqshl;
7173 break;
7174 case ARM::BI__builtin_arm_mve_srshr:
7175 Param0 = Intrinsic::arm_mve_srshr;
7176 break;
7177 case ARM::BI__builtin_arm_mve_uqrshl:
7178 Param0 = Intrinsic::arm_mve_uqrshl;
7179 break;
7180 case ARM::BI__builtin_arm_mve_uqshl:
7181 Param0 = Intrinsic::arm_mve_uqshl;
7182 break;
7183 case ARM::BI__builtin_arm_mve_urshr:
7184 Param0 = Intrinsic::arm_mve_urshr;
7185 break;
7186 }
7187 Value *Val0 = EmitScalarExpr(E->getArg(0));
7188 Value *Val1 = EmitScalarExpr(E->getArg(1));
7189 return Builder.CreateCall(CGM.getIntrinsic(Param0), {Val0, Val1});
7190 }
7191 case ARM::BI__builtin_arm_mve_vbrsrq_n_f16:
7192 case ARM::BI__builtin_arm_mve_vbrsrq_n_f32:
7193 case ARM::BI__builtin_arm_mve_vbrsrq_n_s16:
7194 case ARM::BI__builtin_arm_mve_vbrsrq_n_s32:
7195 case ARM::BI__builtin_arm_mve_vbrsrq_n_s8:
7196 case ARM::BI__builtin_arm_mve_vbrsrq_n_u16:
7197 case ARM::BI__builtin_arm_mve_vbrsrq_n_u32:
7198 case ARM::BI__builtin_arm_mve_vbrsrq_n_u8:
7199 case ARM::BI__builtin_arm_mve_vmaxnmq_f16:
7200 case ARM::BI__builtin_arm_mve_vmaxnmq_f32:
7201 case ARM::BI__builtin_arm_mve_vminnmq_f16:
7202 case ARM::BI__builtin_arm_mve_vminnmq_f32:
7203 case ARM::BI__builtin_arm_mve_vqaddq_s16:
7204 case ARM::BI__builtin_arm_mve_vqaddq_s32:
7205 case ARM::BI__builtin_arm_mve_vqaddq_s8:
7206 case ARM::BI__builtin_arm_mve_vqaddq_u16:
7207 case ARM::BI__builtin_arm_mve_vqaddq_u32:
7208 case ARM::BI__builtin_arm_mve_vqaddq_u8:
7209 case ARM::BI__builtin_arm_mve_vqdmulhq_s16:
7210 case ARM::BI__builtin_arm_mve_vqdmulhq_s32:
7211 case ARM::BI__builtin_arm_mve_vqdmulhq_s8:
7212 case ARM::BI__builtin_arm_mve_vqrdmulhq_s16:
7213 case ARM::BI__builtin_arm_mve_vqrdmulhq_s32:
7214 case ARM::BI__builtin_arm_mve_vqrdmulhq_s8:
7215 case ARM::BI__builtin_arm_mve_vqshluq_n_s16:
7216 case ARM::BI__builtin_arm_mve_vqshluq_n_s32:
7217 case ARM::BI__builtin_arm_mve_vqshluq_n_s8:
7218 case ARM::BI__builtin_arm_mve_vqsubq_s16:
7219 case ARM::BI__builtin_arm_mve_vqsubq_s32:
7220 case ARM::BI__builtin_arm_mve_vqsubq_s8:
7221 case ARM::BI__builtin_arm_mve_vqsubq_u16:
7222 case ARM::BI__builtin_arm_mve_vqsubq_u32:
7223 case ARM::BI__builtin_arm_mve_vqsubq_u8: {
7224 Intrinsic::ID Param0;
7225 llvm::Type * Param1;
7226 switch (BuiltinID) {
7227 case ARM::BI__builtin_arm_mve_vbrsrq_n_f16:
7228 Param0 = Intrinsic::arm_mve_vbrsr;
7229 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
7230 break;
7231 case ARM::BI__builtin_arm_mve_vbrsrq_n_f32:
7232 Param0 = Intrinsic::arm_mve_vbrsr;
7233 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
7234 break;
7235 case ARM::BI__builtin_arm_mve_vbrsrq_n_s16:
7236 Param0 = Intrinsic::arm_mve_vbrsr;
7237 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7238 break;
7239 case ARM::BI__builtin_arm_mve_vbrsrq_n_s32:
7240 Param0 = Intrinsic::arm_mve_vbrsr;
7241 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7242 break;
7243 case ARM::BI__builtin_arm_mve_vbrsrq_n_s8:
7244 Param0 = Intrinsic::arm_mve_vbrsr;
7245 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7246 break;
7247 case ARM::BI__builtin_arm_mve_vbrsrq_n_u16:
7248 Param0 = Intrinsic::arm_mve_vbrsr;
7249 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7250 break;
7251 case ARM::BI__builtin_arm_mve_vbrsrq_n_u32:
7252 Param0 = Intrinsic::arm_mve_vbrsr;
7253 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7254 break;
7255 case ARM::BI__builtin_arm_mve_vbrsrq_n_u8:
7256 Param0 = Intrinsic::arm_mve_vbrsr;
7257 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7258 break;
7259 case ARM::BI__builtin_arm_mve_vmaxnmq_f16:
7260 Param0 = Intrinsic::maxnum;
7261 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
7262 break;
7263 case ARM::BI__builtin_arm_mve_vmaxnmq_f32:
7264 Param0 = Intrinsic::maxnum;
7265 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
7266 break;
7267 case ARM::BI__builtin_arm_mve_vminnmq_f16:
7268 Param0 = Intrinsic::minnum;
7269 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
7270 break;
7271 case ARM::BI__builtin_arm_mve_vminnmq_f32:
7272 Param0 = Intrinsic::minnum;
7273 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
7274 break;
7275 case ARM::BI__builtin_arm_mve_vqaddq_s16:
7276 Param0 = Intrinsic::sadd_sat;
7277 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7278 break;
7279 case ARM::BI__builtin_arm_mve_vqaddq_s32:
7280 Param0 = Intrinsic::sadd_sat;
7281 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7282 break;
7283 case ARM::BI__builtin_arm_mve_vqaddq_s8:
7284 Param0 = Intrinsic::sadd_sat;
7285 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7286 break;
7287 case ARM::BI__builtin_arm_mve_vqaddq_u16:
7288 Param0 = Intrinsic::uadd_sat;
7289 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7290 break;
7291 case ARM::BI__builtin_arm_mve_vqaddq_u32:
7292 Param0 = Intrinsic::uadd_sat;
7293 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7294 break;
7295 case ARM::BI__builtin_arm_mve_vqaddq_u8:
7296 Param0 = Intrinsic::uadd_sat;
7297 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7298 break;
7299 case ARM::BI__builtin_arm_mve_vqdmulhq_s16:
7300 Param0 = Intrinsic::arm_mve_vqdmulh;
7301 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7302 break;
7303 case ARM::BI__builtin_arm_mve_vqdmulhq_s32:
7304 Param0 = Intrinsic::arm_mve_vqdmulh;
7305 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7306 break;
7307 case ARM::BI__builtin_arm_mve_vqdmulhq_s8:
7308 Param0 = Intrinsic::arm_mve_vqdmulh;
7309 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7310 break;
7311 case ARM::BI__builtin_arm_mve_vqrdmulhq_s16:
7312 Param0 = Intrinsic::arm_mve_vqrdmulh;
7313 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7314 break;
7315 case ARM::BI__builtin_arm_mve_vqrdmulhq_s32:
7316 Param0 = Intrinsic::arm_mve_vqrdmulh;
7317 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7318 break;
7319 case ARM::BI__builtin_arm_mve_vqrdmulhq_s8:
7320 Param0 = Intrinsic::arm_mve_vqrdmulh;
7321 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7322 break;
7323 case ARM::BI__builtin_arm_mve_vqshluq_n_s16:
7324 Param0 = Intrinsic::arm_mve_vqshlu_imm;
7325 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7326 break;
7327 case ARM::BI__builtin_arm_mve_vqshluq_n_s32:
7328 Param0 = Intrinsic::arm_mve_vqshlu_imm;
7329 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7330 break;
7331 case ARM::BI__builtin_arm_mve_vqshluq_n_s8:
7332 Param0 = Intrinsic::arm_mve_vqshlu_imm;
7333 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7334 break;
7335 case ARM::BI__builtin_arm_mve_vqsubq_s16:
7336 Param0 = Intrinsic::ssub_sat;
7337 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7338 break;
7339 case ARM::BI__builtin_arm_mve_vqsubq_s32:
7340 Param0 = Intrinsic::ssub_sat;
7341 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7342 break;
7343 case ARM::BI__builtin_arm_mve_vqsubq_s8:
7344 Param0 = Intrinsic::ssub_sat;
7345 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7346 break;
7347 case ARM::BI__builtin_arm_mve_vqsubq_u16:
7348 Param0 = Intrinsic::usub_sat;
7349 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
7350 break;
7351 case ARM::BI__builtin_arm_mve_vqsubq_u32:
7352 Param0 = Intrinsic::usub_sat;
7353 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
7354 break;
7355 case ARM::BI__builtin_arm_mve_vqsubq_u8:
7356 Param0 = Intrinsic::usub_sat;
7357 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
7358 break;
7359 }
7360 Value *Val0 = EmitScalarExpr(E->getArg(0));
7361 Value *Val1 = EmitScalarExpr(E->getArg(1));
7362 return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0, Val1});
7363 }
7364 case ARM::BI__builtin_arm_mve_vgetq_lane_f16:
7365 case ARM::BI__builtin_arm_mve_vgetq_lane_f32:
7366 case ARM::BI__builtin_arm_mve_vgetq_lane_s16:
7367 case ARM::BI__builtin_arm_mve_vgetq_lane_s32:
7368 case ARM::BI__builtin_arm_mve_vgetq_lane_s64:
7369 case ARM::BI__builtin_arm_mve_vgetq_lane_s8:
7370 case ARM::BI__builtin_arm_mve_vgetq_lane_u16:
7371 case ARM::BI__builtin_arm_mve_vgetq_lane_u32:
7372 case ARM::BI__builtin_arm_mve_vgetq_lane_u64:
7373 case ARM::BI__builtin_arm_mve_vgetq_lane_u8: {
7374 Value *Val0 = EmitScalarExpr(E->getArg(0));
7375 Value *Val1 = EmitScalarExpr(E->getArg(1));
7376 return Builder.CreateExtractElement(Val0, Val1);
7377 }
7378 case ARM::BI__builtin_arm_mve_vaddq_f16:
7379 case ARM::BI__builtin_arm_mve_vaddq_f32: {
7380 Value *Val0 = EmitScalarExpr(E->getArg(0));
7381 Value *Val1 = EmitScalarExpr(E->getArg(1));
7382 return Builder.CreateFAdd(Val0, Val1);
7383 }
7384 case ARM::BI__builtin_arm_mve_vmulq_f16:
7385 case ARM::BI__builtin_arm_mve_vmulq_f32: {
7386 Value *Val0 = EmitScalarExpr(E->getArg(0));
7387 Value *Val1 = EmitScalarExpr(E->getArg(1));
7388 return Builder.CreateFMul(Val0, Val1);
7389 }
7390 case ARM::BI__builtin_arm_mve_vsubq_f16:
7391 case ARM::BI__builtin_arm_mve_vsubq_f32: {
7392 Value *Val0 = EmitScalarExpr(E->getArg(0));
7393 Value *Val1 = EmitScalarExpr(E->getArg(1));
7394 return Builder.CreateFSub(Val0, Val1);
7395 }
7396 case ARM::BI__builtin_arm_mve_vmulq_s16:
7397 case ARM::BI__builtin_arm_mve_vmulq_s32:
7398 case ARM::BI__builtin_arm_mve_vmulq_s8:
7399 case ARM::BI__builtin_arm_mve_vmulq_u16:
7400 case ARM::BI__builtin_arm_mve_vmulq_u32:
7401 case ARM::BI__builtin_arm_mve_vmulq_u8: {
7402 Value *Val0 = EmitScalarExpr(E->getArg(0));
7403 Value *Val1 = EmitScalarExpr(E->getArg(1));
7404 return Builder.CreateMul(Val0, Val1);
7405 }
7406 case ARM::BI__builtin_arm_mve_vorrq_s16:
7407 case ARM::BI__builtin_arm_mve_vorrq_s32:
7408 case ARM::BI__builtin_arm_mve_vorrq_s8:
7409 case ARM::BI__builtin_arm_mve_vorrq_u16:
7410 case ARM::BI__builtin_arm_mve_vorrq_u32:
7411 case ARM::BI__builtin_arm_mve_vorrq_u8: {
7412 Value *Val0 = EmitScalarExpr(E->getArg(0));
7413 Value *Val1 = EmitScalarExpr(E->getArg(1));
7414 return Builder.CreateOr(Val0, Val1);
7415 }
7416 case ARM::BI__builtin_arm_mve_vsubq_s16:
7417 case ARM::BI__builtin_arm_mve_vsubq_s32:
7418 case ARM::BI__builtin_arm_mve_vsubq_s8:
7419 case ARM::BI__builtin_arm_mve_vsubq_u16:
7420 case ARM::BI__builtin_arm_mve_vsubq_u32:
7421 case ARM::BI__builtin_arm_mve_vsubq_u8: {
7422 Value *Val0 = EmitScalarExpr(E->getArg(0));
7423 Value *Val1 = EmitScalarExpr(E->getArg(1));
7424 return Builder.CreateSub(Val0, Val1);
7425 }
7426 case ARM::BI__builtin_arm_mve_veorq_s16:
7427 case ARM::BI__builtin_arm_mve_veorq_s32:
7428 case ARM::BI__builtin_arm_mve_veorq_s8:
7429 case ARM::BI__builtin_arm_mve_veorq_u16:
7430 case ARM::BI__builtin_arm_mve_veorq_u32:
7431 case ARM::BI__builtin_arm_mve_veorq_u8: {
7432 Value *Val0 = EmitScalarExpr(E->getArg(0));
7433 Value *Val1 = EmitScalarExpr(E->getArg(1));
7434 return Builder.CreateXor(Val0, Val1);
7435 }
7436 case ARM::BI__builtin_arm_mve_vmovlbq_s8:
7437 case ARM::BI__builtin_arm_mve_vmovlbq_u8:
7438 case ARM::BI__builtin_arm_mve_vmovltq_s8:
7439 case ARM::BI__builtin_arm_mve_vmovltq_u8: {
7440 bool Param0;
7441 bool Param1;
7442 switch (BuiltinID) {
7443 case ARM::BI__builtin_arm_mve_vmovlbq_s8:
7444 Param0 = 0;
7445 Param1 = 0;
7446 break;
7447 case ARM::BI__builtin_arm_mve_vmovlbq_u8:
7448 Param0 = 0;
7449 Param1 = 1;
7450 break;
7451 case ARM::BI__builtin_arm_mve_vmovltq_s8:
7452 Param0 = 1;
7453 Param1 = 0;
7454 break;
7455 case ARM::BI__builtin_arm_mve_vmovltq_u8:
7456 Param0 = 1;
7457 Param1 = 1;
7458 break;
7459 }
7460 Value *Val0 = EmitScalarExpr(E->getArg(0));
7461 Value *Val1 = VectorUnzip(Builder, Val0, static_cast<bool>(Param0));
7462 llvm::Type *Val2 = llvm::FixedVectorType::get(Int16Ty, 8);
7463 return SignOrZeroExtend(Builder, Val1, Val2, static_cast<bool>(Param1));
7464 }
7465 case ARM::BI__builtin_arm_mve_vmovlbq_s16:
7466 case ARM::BI__builtin_arm_mve_vmovlbq_u16:
7467 case ARM::BI__builtin_arm_mve_vmovltq_s16:
7468 case ARM::BI__builtin_arm_mve_vmovltq_u16: {
7469 bool Param0;
7470 bool Param1;
7471 switch (BuiltinID) {
7472 case ARM::BI__builtin_arm_mve_vmovlbq_s16:
7473 Param0 = 0;
7474 Param1 = 0;
7475 break;
7476 case ARM::BI__builtin_arm_mve_vmovlbq_u16:
7477 Param0 = 0;
7478 Param1 = 1;
7479 break;
7480 case ARM::BI__builtin_arm_mve_vmovltq_s16:
7481 Param0 = 1;
7482 Param1 = 0;
7483 break;
7484 case ARM::BI__builtin_arm_mve_vmovltq_u16:
7485 Param0 = 1;
7486 Param1 = 1;
7487 break;
7488 }
7489 Value *Val0 = EmitScalarExpr(E->getArg(0));
7490 Value *Val1 = VectorUnzip(Builder, Val0, static_cast<bool>(Param0));
7491 llvm::Type *Val2 = llvm::FixedVectorType::get(Int32Ty, 4);
7492 return SignOrZeroExtend(Builder, Val1, Val2, static_cast<bool>(Param1));
7493 }
7494 case ARM::BI__builtin_arm_mve_vclzq_s16:
7495 case ARM::BI__builtin_arm_mve_vclzq_s32:
7496 case ARM::BI__builtin_arm_mve_vclzq_s8:
7497 case ARM::BI__builtin_arm_mve_vclzq_u16:
7498 case ARM::BI__builtin_arm_mve_vclzq_u32:
7499 case ARM::BI__builtin_arm_mve_vclzq_u8: {
7500 llvm::Type * Param0;
7501 switch (BuiltinID) {
7502 case ARM::BI__builtin_arm_mve_vclzq_s16:
7503 Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
7504 break;
7505 case ARM::BI__builtin_arm_mve_vclzq_s32:
7506 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
7507 break;
7508 case ARM::BI__builtin_arm_mve_vclzq_s8:
7509 Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
7510 break;
7511 case ARM::BI__builtin_arm_mve_vclzq_u16:
7512 Param0 = llvm::FixedVectorType::get(Int16Ty, 8);
7513 break;
7514 case ARM::BI__builtin_arm_mve_vclzq_u32:
7515 Param0 = llvm::FixedVectorType::get(Int32Ty, 4);
7516 break;
7517 case ARM::BI__builtin_arm_mve_vclzq_u8:
7518 Param0 = llvm::FixedVectorType::get(Int8Ty, 16);
7519 break;
7520 }
7521 Value *Val0 = EmitScalarExpr(E->getArg(0));
7522 Value *Val1 = llvm::ConstantInt::get(Builder.getInt1Ty(), static_cast<bool>(0));
7523 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::ctlz, {Param0}), {Val0, Val1});
7524 }
7525 case ARM::BI__builtin_arm_mve_vpnot: {
7526 Value *Val0 = EmitScalarExpr(E->getArg(0));
7527 Value *Val1 = llvm::ConstantInt::get(Int16Ty, 65535);
7528 return Builder.CreateXor(Val0, Val1);
7529 }
7530 case ARM::BI__builtin_arm_mve_vaddlvq_p_s32:
7531 case ARM::BI__builtin_arm_mve_vaddlvq_p_u32:
7532 case ARM::BI__builtin_arm_mve_vaddvq_p_s16:
7533 case ARM::BI__builtin_arm_mve_vaddvq_p_s32:
7534 case ARM::BI__builtin_arm_mve_vaddvq_p_s8:
7535 case ARM::BI__builtin_arm_mve_vaddvq_p_u16:
7536 case ARM::BI__builtin_arm_mve_vaddvq_p_u32:
7537 case ARM::BI__builtin_arm_mve_vaddvq_p_u8: {
7538 uint32_t Param0;
7539 llvm::Type * Param1;
7540 Intrinsic::ID Param2;
7541 llvm::Type * Param3;
7542 switch (BuiltinID) {
7543 case ARM::BI__builtin_arm_mve_vaddlvq_p_s32:
7544 Param0 = 0;
7545 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7546 Param2 = Intrinsic::arm_mve_addlv_predicated;
7547 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
7548 break;
7549 case ARM::BI__builtin_arm_mve_vaddlvq_p_u32:
7550 Param0 = 1;
7551 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7552 Param2 = Intrinsic::arm_mve_addlv_predicated;
7553 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
7554 break;
7555 case ARM::BI__builtin_arm_mve_vaddvq_p_s16:
7556 Param0 = 0;
7557 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7558 Param2 = Intrinsic::arm_mve_addv_predicated;
7559 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
7560 break;
7561 case ARM::BI__builtin_arm_mve_vaddvq_p_s32:
7562 Param0 = 0;
7563 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7564 Param2 = Intrinsic::arm_mve_addv_predicated;
7565 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
7566 break;
7567 case ARM::BI__builtin_arm_mve_vaddvq_p_s8:
7568 Param0 = 0;
7569 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
7570 Param2 = Intrinsic::arm_mve_addv_predicated;
7571 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
7572 break;
7573 case ARM::BI__builtin_arm_mve_vaddvq_p_u16:
7574 Param0 = 1;
7575 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7576 Param2 = Intrinsic::arm_mve_addv_predicated;
7577 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
7578 break;
7579 case ARM::BI__builtin_arm_mve_vaddvq_p_u32:
7580 Param0 = 1;
7581 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7582 Param2 = Intrinsic::arm_mve_addv_predicated;
7583 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
7584 break;
7585 case ARM::BI__builtin_arm_mve_vaddvq_p_u8:
7586 Param0 = 1;
7587 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
7588 Param2 = Intrinsic::arm_mve_addv_predicated;
7589 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
7590 break;
7591 }
7592 Value *Val0 = EmitScalarExpr(E->getArg(0));
7593 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
7594 Value *Val2 = EmitScalarExpr(E->getArg(1));
7595 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
7596 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
7597 return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val4});
7598 }
7599 case ARM::BI__builtin_arm_mve_vcvtbq_f32_f16:
7600 case ARM::BI__builtin_arm_mve_vcvttq_f32_f16: {
7601 uint32_t Param0;
7602 switch (BuiltinID) {
7603 case ARM::BI__builtin_arm_mve_vcvtbq_f32_f16:
7604 Param0 = 0;
7605 break;
7606 case ARM::BI__builtin_arm_mve_vcvttq_f32_f16:
7607 Param0 = 1;
7608 break;
7609 }
7610 Value *Val0 = EmitScalarExpr(E->getArg(0));
7611 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
7612 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_widen), {Val0, Val1});
7613 }
7614 case ARM::BI__builtin_arm_mve_vaddlvq_s32:
7615 case ARM::BI__builtin_arm_mve_vaddlvq_u32:
7616 case ARM::BI__builtin_arm_mve_vaddvq_s16:
7617 case ARM::BI__builtin_arm_mve_vaddvq_s32:
7618 case ARM::BI__builtin_arm_mve_vaddvq_s8:
7619 case ARM::BI__builtin_arm_mve_vaddvq_u16:
7620 case ARM::BI__builtin_arm_mve_vaddvq_u32:
7621 case ARM::BI__builtin_arm_mve_vaddvq_u8: {
7622 uint32_t Param0;
7623 Intrinsic::ID Param1;
7624 llvm::Type * Param2;
7625 switch (BuiltinID) {
7626 case ARM::BI__builtin_arm_mve_vaddlvq_s32:
7627 Param0 = 0;
7628 Param1 = Intrinsic::arm_mve_addlv;
7629 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7630 break;
7631 case ARM::BI__builtin_arm_mve_vaddlvq_u32:
7632 Param0 = 1;
7633 Param1 = Intrinsic::arm_mve_addlv;
7634 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7635 break;
7636 case ARM::BI__builtin_arm_mve_vaddvq_s16:
7637 Param0 = 0;
7638 Param1 = Intrinsic::arm_mve_addv;
7639 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7640 break;
7641 case ARM::BI__builtin_arm_mve_vaddvq_s32:
7642 Param0 = 0;
7643 Param1 = Intrinsic::arm_mve_addv;
7644 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7645 break;
7646 case ARM::BI__builtin_arm_mve_vaddvq_s8:
7647 Param0 = 0;
7648 Param1 = Intrinsic::arm_mve_addv;
7649 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7650 break;
7651 case ARM::BI__builtin_arm_mve_vaddvq_u16:
7652 Param0 = 1;
7653 Param1 = Intrinsic::arm_mve_addv;
7654 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
7655 break;
7656 case ARM::BI__builtin_arm_mve_vaddvq_u32:
7657 Param0 = 1;
7658 Param1 = Intrinsic::arm_mve_addv;
7659 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
7660 break;
7661 case ARM::BI__builtin_arm_mve_vaddvq_u8:
7662 Param0 = 1;
7663 Param1 = Intrinsic::arm_mve_addv;
7664 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
7665 break;
7666 }
7667 Value *Val0 = EmitScalarExpr(E->getArg(0));
7668 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
7669 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1});
7670 }
7671 case ARM::BI__builtin_arm_mve_asrl:
7672 case ARM::BI__builtin_arm_mve_lsll:
7673 case ARM::BI__builtin_arm_mve_sqshll:
7674 case ARM::BI__builtin_arm_mve_srshrl:
7675 case ARM::BI__builtin_arm_mve_uqshll:
7676 case ARM::BI__builtin_arm_mve_urshrl: {
7677 Intrinsic::ID Param0;
7678 switch (BuiltinID) {
7679 case ARM::BI__builtin_arm_mve_asrl:
7680 Param0 = Intrinsic::arm_mve_asrl;
7681 break;
7682 case ARM::BI__builtin_arm_mve_lsll:
7683 Param0 = Intrinsic::arm_mve_lsll;
7684 break;
7685 case ARM::BI__builtin_arm_mve_sqshll:
7686 Param0 = Intrinsic::arm_mve_sqshll;
7687 break;
7688 case ARM::BI__builtin_arm_mve_srshrl:
7689 Param0 = Intrinsic::arm_mve_srshrl;
7690 break;
7691 case ARM::BI__builtin_arm_mve_uqshll:
7692 Param0 = Intrinsic::arm_mve_uqshll;
7693 break;
7694 case ARM::BI__builtin_arm_mve_urshrl:
7695 Param0 = Intrinsic::arm_mve_urshrl;
7696 break;
7697 }
7698 Value *Val0 = EmitScalarExpr(E->getArg(0));
7699 Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
7700 Value *Val2 = Builder.CreateLShr(Val0, Val1);
7701 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
7702 Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
7703 Value *Val5 = EmitScalarExpr(E->getArg(1));
7704 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Param0), {Val4, Val3, Val5});
7705 Value *Val7 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(1));
7706 Value *Val8 = Builder.CreateIntCast(Val7, Int64Ty, false);
7707 Value *Val9 = llvm::ConstantInt::get(Int64Ty, 32);
7708 Value *Val10 = Builder.CreateShl(Val8, Val9);
7709 Value *Val11 = Builder.CreateExtractValue(Val6, static_cast<unsigned>(0));
7710 Value *Val12 = Builder.CreateIntCast(Val11, Int64Ty, false);
7711 return Builder.CreateOr(Val10, Val12);
7712 }
7713 case ARM::BI__builtin_arm_mve_sqrshrl:
7714 case ARM::BI__builtin_arm_mve_sqrshrl_sat48: {
7715 uint32_t Param0;
7716 switch (BuiltinID) {
7717 case ARM::BI__builtin_arm_mve_sqrshrl:
7718 Param0 = 64;
7719 break;
7720 case ARM::BI__builtin_arm_mve_sqrshrl_sat48:
7721 Param0 = 48;
7722 break;
7723 }
7724 Value *Val0 = EmitScalarExpr(E->getArg(0));
7725 Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
7726 Value *Val2 = Builder.CreateLShr(Val0, Val1);
7727 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
7728 Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
7729 Value *Val5 = EmitScalarExpr(E->getArg(1));
7730 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param0);
7731 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_sqrshrl), {Val4, Val3, Val5, Val6});
7732 Value *Val8 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(1));
7733 Value *Val9 = Builder.CreateIntCast(Val8, Int64Ty, false);
7734 Value *Val10 = llvm::ConstantInt::get(Int64Ty, 32);
7735 Value *Val11 = Builder.CreateShl(Val9, Val10);
7736 Value *Val12 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
7737 Value *Val13 = Builder.CreateIntCast(Val12, Int64Ty, false);
7738 return Builder.CreateOr(Val11, Val13);
7739 }
7740 case ARM::BI__builtin_arm_mve_uqrshll:
7741 case ARM::BI__builtin_arm_mve_uqrshll_sat48: {
7742 uint32_t Param0;
7743 switch (BuiltinID) {
7744 case ARM::BI__builtin_arm_mve_uqrshll:
7745 Param0 = 64;
7746 break;
7747 case ARM::BI__builtin_arm_mve_uqrshll_sat48:
7748 Param0 = 48;
7749 break;
7750 }
7751 Value *Val0 = EmitScalarExpr(E->getArg(0));
7752 Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
7753 Value *Val2 = Builder.CreateLShr(Val0, Val1);
7754 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
7755 Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
7756 Value *Val5 = EmitScalarExpr(E->getArg(1));
7757 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param0);
7758 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_uqrshll), {Val4, Val3, Val5, Val6});
7759 Value *Val8 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(1));
7760 Value *Val9 = Builder.CreateIntCast(Val8, Int64Ty, false);
7761 Value *Val10 = llvm::ConstantInt::get(Int64Ty, 32);
7762 Value *Val11 = Builder.CreateShl(Val9, Val10);
7763 Value *Val12 = Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
7764 Value *Val13 = Builder.CreateIntCast(Val12, Int64Ty, false);
7765 return Builder.CreateOr(Val11, Val13);
7766 }
7767 case ARM::BI__builtin_arm_mve_vmlaldavaq_s16:
7768 case ARM::BI__builtin_arm_mve_vmlaldavaq_s32:
7769 case ARM::BI__builtin_arm_mve_vmlaldavaq_u16:
7770 case ARM::BI__builtin_arm_mve_vmlaldavaq_u32:
7771 case ARM::BI__builtin_arm_mve_vmlaldavaxq_s16:
7772 case ARM::BI__builtin_arm_mve_vmlaldavaxq_s32:
7773 case ARM::BI__builtin_arm_mve_vmlsldavaq_s16:
7774 case ARM::BI__builtin_arm_mve_vmlsldavaq_s32:
7775 case ARM::BI__builtin_arm_mve_vmlsldavaxq_s16:
7776 case ARM::BI__builtin_arm_mve_vmlsldavaxq_s32:
7777 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_s32:
7778 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_u32:
7779 case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_s32:
7780 case ARM::BI__builtin_arm_mve_vrmlsldavhaq_s32:
7781 case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_s32: {
7782 uint32_t Param0;
7783 uint32_t Param1;
7784 uint32_t Param2;
7785 Intrinsic::ID Param3;
7786 llvm::Type * Param4;
7787 switch (BuiltinID) {
7788 case ARM::BI__builtin_arm_mve_vmlaldavaq_s16:
7789 Param0 = 0;
7790 Param1 = 0;
7791 Param2 = 0;
7792 Param3 = Intrinsic::arm_mve_vmlldava;
7793 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
7794 break;
7795 case ARM::BI__builtin_arm_mve_vmlaldavaq_s32:
7796 Param0 = 0;
7797 Param1 = 0;
7798 Param2 = 0;
7799 Param3 = Intrinsic::arm_mve_vmlldava;
7800 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7801 break;
7802 case ARM::BI__builtin_arm_mve_vmlaldavaq_u16:
7803 Param0 = 1;
7804 Param1 = 0;
7805 Param2 = 0;
7806 Param3 = Intrinsic::arm_mve_vmlldava;
7807 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
7808 break;
7809 case ARM::BI__builtin_arm_mve_vmlaldavaq_u32:
7810 Param0 = 1;
7811 Param1 = 0;
7812 Param2 = 0;
7813 Param3 = Intrinsic::arm_mve_vmlldava;
7814 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7815 break;
7816 case ARM::BI__builtin_arm_mve_vmlaldavaxq_s16:
7817 Param0 = 0;
7818 Param1 = 0;
7819 Param2 = 1;
7820 Param3 = Intrinsic::arm_mve_vmlldava;
7821 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
7822 break;
7823 case ARM::BI__builtin_arm_mve_vmlaldavaxq_s32:
7824 Param0 = 0;
7825 Param1 = 0;
7826 Param2 = 1;
7827 Param3 = Intrinsic::arm_mve_vmlldava;
7828 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7829 break;
7830 case ARM::BI__builtin_arm_mve_vmlsldavaq_s16:
7831 Param0 = 0;
7832 Param1 = 1;
7833 Param2 = 0;
7834 Param3 = Intrinsic::arm_mve_vmlldava;
7835 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
7836 break;
7837 case ARM::BI__builtin_arm_mve_vmlsldavaq_s32:
7838 Param0 = 0;
7839 Param1 = 1;
7840 Param2 = 0;
7841 Param3 = Intrinsic::arm_mve_vmlldava;
7842 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7843 break;
7844 case ARM::BI__builtin_arm_mve_vmlsldavaxq_s16:
7845 Param0 = 0;
7846 Param1 = 1;
7847 Param2 = 1;
7848 Param3 = Intrinsic::arm_mve_vmlldava;
7849 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
7850 break;
7851 case ARM::BI__builtin_arm_mve_vmlsldavaxq_s32:
7852 Param0 = 0;
7853 Param1 = 1;
7854 Param2 = 1;
7855 Param3 = Intrinsic::arm_mve_vmlldava;
7856 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7857 break;
7858 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_s32:
7859 Param0 = 0;
7860 Param1 = 0;
7861 Param2 = 0;
7862 Param3 = Intrinsic::arm_mve_vrmlldavha;
7863 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7864 break;
7865 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_u32:
7866 Param0 = 1;
7867 Param1 = 0;
7868 Param2 = 0;
7869 Param3 = Intrinsic::arm_mve_vrmlldavha;
7870 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7871 break;
7872 case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_s32:
7873 Param0 = 0;
7874 Param1 = 0;
7875 Param2 = 1;
7876 Param3 = Intrinsic::arm_mve_vrmlldavha;
7877 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7878 break;
7879 case ARM::BI__builtin_arm_mve_vrmlsldavhaq_s32:
7880 Param0 = 0;
7881 Param1 = 1;
7882 Param2 = 0;
7883 Param3 = Intrinsic::arm_mve_vrmlldavha;
7884 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7885 break;
7886 case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_s32:
7887 Param0 = 0;
7888 Param1 = 1;
7889 Param2 = 1;
7890 Param3 = Intrinsic::arm_mve_vrmlldavha;
7891 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
7892 break;
7893 }
7894 Value *Val0 = EmitScalarExpr(E->getArg(0));
7895 Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
7896 Value *Val2 = Builder.CreateLShr(Val0, Val1);
7897 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
7898 Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
7899 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
7900 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
7901 Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param2);
7902 Value *Val8 = EmitScalarExpr(E->getArg(1));
7903 Value *Val9 = EmitScalarExpr(E->getArg(2));
7904 Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4}), {Val5, Val6, Val7, Val4, Val3, Val8, Val9});
7905 Value *Val11 = Builder.CreateExtractValue(Val10, static_cast<unsigned>(1));
7906 Value *Val12 = Builder.CreateIntCast(Val11, Int64Ty, false);
7907 Value *Val13 = llvm::ConstantInt::get(Int64Ty, 32);
7908 Value *Val14 = Builder.CreateShl(Val12, Val13);
7909 Value *Val15 = Builder.CreateExtractValue(Val10, static_cast<unsigned>(0));
7910 Value *Val16 = Builder.CreateIntCast(Val15, Int64Ty, false);
7911 return Builder.CreateOr(Val14, Val16);
7912 }
7913 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s16:
7914 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s32:
7915 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u16:
7916 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u32:
7917 case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s16:
7918 case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s32:
7919 case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s16:
7920 case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s32:
7921 case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s16:
7922 case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s32:
7923 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_s32:
7924 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_u32:
7925 case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_p_s32:
7926 case ARM::BI__builtin_arm_mve_vrmlsldavhaq_p_s32:
7927 case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_p_s32: {
7928 uint32_t Param0;
7929 uint32_t Param1;
7930 uint32_t Param2;
7931 llvm::Type * Param3;
7932 Intrinsic::ID Param4;
7933 llvm::Type * Param5;
7934 switch (BuiltinID) {
7935 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s16:
7936 Param0 = 0;
7937 Param1 = 0;
7938 Param2 = 0;
7939 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7940 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7941 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
7942 break;
7943 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_s32:
7944 Param0 = 0;
7945 Param1 = 0;
7946 Param2 = 0;
7947 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7948 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7949 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
7950 break;
7951 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u16:
7952 Param0 = 1;
7953 Param1 = 0;
7954 Param2 = 0;
7955 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7956 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7957 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
7958 break;
7959 case ARM::BI__builtin_arm_mve_vmlaldavaq_p_u32:
7960 Param0 = 1;
7961 Param1 = 0;
7962 Param2 = 0;
7963 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7964 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7965 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
7966 break;
7967 case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s16:
7968 Param0 = 0;
7969 Param1 = 0;
7970 Param2 = 1;
7971 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7972 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7973 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
7974 break;
7975 case ARM::BI__builtin_arm_mve_vmlaldavaxq_p_s32:
7976 Param0 = 0;
7977 Param1 = 0;
7978 Param2 = 1;
7979 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7980 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7981 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
7982 break;
7983 case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s16:
7984 Param0 = 0;
7985 Param1 = 1;
7986 Param2 = 0;
7987 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
7988 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7989 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
7990 break;
7991 case ARM::BI__builtin_arm_mve_vmlsldavaq_p_s32:
7992 Param0 = 0;
7993 Param1 = 1;
7994 Param2 = 0;
7995 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
7996 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
7997 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
7998 break;
7999 case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s16:
8000 Param0 = 0;
8001 Param1 = 1;
8002 Param2 = 1;
8003 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8004 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
8005 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
8006 break;
8007 case ARM::BI__builtin_arm_mve_vmlsldavaxq_p_s32:
8008 Param0 = 0;
8009 Param1 = 1;
8010 Param2 = 1;
8011 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8012 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
8013 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8014 break;
8015 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_s32:
8016 Param0 = 0;
8017 Param1 = 0;
8018 Param2 = 0;
8019 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8020 Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
8021 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8022 break;
8023 case ARM::BI__builtin_arm_mve_vrmlaldavhaq_p_u32:
8024 Param0 = 1;
8025 Param1 = 0;
8026 Param2 = 0;
8027 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8028 Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
8029 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8030 break;
8031 case ARM::BI__builtin_arm_mve_vrmlaldavhaxq_p_s32:
8032 Param0 = 0;
8033 Param1 = 0;
8034 Param2 = 1;
8035 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8036 Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
8037 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8038 break;
8039 case ARM::BI__builtin_arm_mve_vrmlsldavhaq_p_s32:
8040 Param0 = 0;
8041 Param1 = 1;
8042 Param2 = 0;
8043 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8044 Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
8045 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8046 break;
8047 case ARM::BI__builtin_arm_mve_vrmlsldavhaxq_p_s32:
8048 Param0 = 0;
8049 Param1 = 1;
8050 Param2 = 1;
8051 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8052 Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
8053 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
8054 break;
8055 }
8056 Value *Val0 = EmitScalarExpr(E->getArg(0));
8057 Value *Val1 = llvm::ConstantInt::get(Int64Ty, 32);
8058 Value *Val2 = Builder.CreateLShr(Val0, Val1);
8059 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
8060 Value *Val4 = Builder.CreateIntCast(Val0, Int32Ty, false);
8061 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
8062 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
8063 Value *Val7 = llvm::ConstantInt::get(Int32Ty, Param2);
8064 Value *Val8 = EmitScalarExpr(E->getArg(1));
8065 Value *Val9 = EmitScalarExpr(E->getArg(2));
8066 Value *Val10 = EmitScalarExpr(E->getArg(3));
8067 Value *Val11 = Builder.CreateIntCast(Val10, Int32Ty, false);
8068 Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val11});
8069 Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param4, {Param5, Param3}), {Val5, Val6, Val7, Val4, Val3, Val8, Val9, Val12});
8070 Value *Val14 = Builder.CreateExtractValue(Val13, static_cast<unsigned>(1));
8071 Value *Val15 = Builder.CreateIntCast(Val14, Int64Ty, false);
8072 Value *Val16 = llvm::ConstantInt::get(Int64Ty, 32);
8073 Value *Val17 = Builder.CreateShl(Val15, Val16);
8074 Value *Val18 = Builder.CreateExtractValue(Val13, static_cast<unsigned>(0));
8075 Value *Val19 = Builder.CreateIntCast(Val18, Int64Ty, false);
8076 return Builder.CreateOr(Val17, Val19);
8077 }
8078 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_f16:
8079 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s16:
8080 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s32:
8081 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s64:
8082 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_s8:
8083 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u16:
8084 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u32:
8085 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u64:
8086 case ARM::BI__builtin_arm_mve_vreinterpretq_f32_u8: {
8087 Value *Val0 = EmitScalarExpr(E->getArg(0));
8088 llvm::Type *Val1 = llvm::FixedVectorType::get(FloatTy, 4);
8089 return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8090 }
8091 case ARM::BI__builtin_arm_mve_vcvtq_f32_s32: {
8092 Value *Val0 = EmitScalarExpr(E->getArg(0));
8093 llvm::Type *Val1 = llvm::FixedVectorType::get(FloatTy, 4);
8094 return Builder.CreateSIToFP(Val0, Val1);
8095 }
8096 case ARM::BI__builtin_arm_mve_vcvtq_f32_u32: {
8097 Value *Val0 = EmitScalarExpr(E->getArg(0));
8098 llvm::Type *Val1 = llvm::FixedVectorType::get(FloatTy, 4);
8099 return Builder.CreateUIToFP(Val0, Val1);
8100 }
8101 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_f32:
8102 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s16:
8103 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s32:
8104 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s64:
8105 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_s8:
8106 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u16:
8107 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u32:
8108 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u64:
8109 case ARM::BI__builtin_arm_mve_vreinterpretq_f16_u8: {
8110 Value *Val0 = EmitScalarExpr(E->getArg(0));
8111 llvm::Type *Val1 = llvm::FixedVectorType::get(HalfTy, 8);
8112 return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8113 }
8114 case ARM::BI__builtin_arm_mve_vcvtq_f16_s16: {
8115 Value *Val0 = EmitScalarExpr(E->getArg(0));
8116 llvm::Type *Val1 = llvm::FixedVectorType::get(HalfTy, 8);
8117 return Builder.CreateSIToFP(Val0, Val1);
8118 }
8119 case ARM::BI__builtin_arm_mve_vcvtq_f16_u16: {
8120 Value *Val0 = EmitScalarExpr(E->getArg(0));
8121 llvm::Type *Val1 = llvm::FixedVectorType::get(HalfTy, 8);
8122 return Builder.CreateUIToFP(Val0, Val1);
8123 }
8124 case ARM::BI__builtin_arm_mve_vqnegq_s16: {
8125 Value *Val0 = EmitScalarExpr(E->getArg(0));
8126 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8127 Value *Val2 = ARMMVEConstantSplat<1,0>(Builder, Val1);
8128 Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
8129 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8130 Value *Val5 = ARMMVEConstantSplat<0,1>(Builder, Val4);
8131 llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
8132 Value *Val7 = llvm::Constant::getNullValue(Val6);
8133 Value *Val8 = Builder.CreateSub(Val7, Val0);
8134 return Builder.CreateSelect(Val3, Val5, Val8);
8135 }
8136 case ARM::BI__builtin_arm_mve_vmvnq_s16:
8137 case ARM::BI__builtin_arm_mve_vmvnq_u16: {
8138 Value *Val0 = EmitScalarExpr(E->getArg(0));
8139 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8140 Value *Val2 = ARMMVEConstantSplat<1,1>(Builder, Val1);
8141 return Builder.CreateXor(Val0, Val2);
8142 }
8143 case ARM::BI__builtin_arm_mve_vmovntq_s16:
8144 case ARM::BI__builtin_arm_mve_vmovntq_u16: {
8145 Value *Val0 = EmitScalarExpr(E->getArg(0));
8146 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8147 Value *Val2 = ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8148 Value *Val3 = EmitScalarExpr(E->getArg(1));
8149 Value *Val4 = VectorZip(Builder, Val2, Val3);
8150 llvm::Type *Val5 = llvm::FixedVectorType::get(Int8Ty, 16);
8151 return Builder.CreateTrunc(Val4, Val5);
8152 }
8153 case ARM::BI__builtin_arm_mve_vandq_f16: {
8154 Value *Val0 = EmitScalarExpr(E->getArg(0));
8155 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8156 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8157 Value *Val3 = EmitScalarExpr(E->getArg(1));
8158 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8159 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8160 Value *Val6 = Builder.CreateAnd(Val2, Val5);
8161 llvm::Type *Val7 = llvm::FixedVectorType::get(HalfTy, 8);
8162 return Builder.CreateBitCast(Val6, Val7);
8163 }
8164 case ARM::BI__builtin_arm_mve_vbicq_f16: {
8165 Value *Val0 = EmitScalarExpr(E->getArg(0));
8166 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8167 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8168 Value *Val3 = EmitScalarExpr(E->getArg(1));
8169 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8170 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8171 Value *Val6 = Builder.CreateNot(Val5);
8172 Value *Val7 = Builder.CreateAnd(Val2, Val6);
8173 llvm::Type *Val8 = llvm::FixedVectorType::get(HalfTy, 8);
8174 return Builder.CreateBitCast(Val7, Val8);
8175 }
8176 case ARM::BI__builtin_arm_mve_vornq_f16: {
8177 Value *Val0 = EmitScalarExpr(E->getArg(0));
8178 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8179 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8180 Value *Val3 = EmitScalarExpr(E->getArg(1));
8181 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8182 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8183 Value *Val6 = Builder.CreateNot(Val5);
8184 Value *Val7 = Builder.CreateOr(Val2, Val6);
8185 llvm::Type *Val8 = llvm::FixedVectorType::get(HalfTy, 8);
8186 return Builder.CreateBitCast(Val7, Val8);
8187 }
8188 case ARM::BI__builtin_arm_mve_vorrq_f16: {
8189 Value *Val0 = EmitScalarExpr(E->getArg(0));
8190 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8191 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8192 Value *Val3 = EmitScalarExpr(E->getArg(1));
8193 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8194 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8195 Value *Val6 = Builder.CreateOr(Val2, Val5);
8196 llvm::Type *Val7 = llvm::FixedVectorType::get(HalfTy, 8);
8197 return Builder.CreateBitCast(Val6, Val7);
8198 }
8199 case ARM::BI__builtin_arm_mve_veorq_f16: {
8200 Value *Val0 = EmitScalarExpr(E->getArg(0));
8201 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8202 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8203 Value *Val3 = EmitScalarExpr(E->getArg(1));
8204 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8205 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8206 Value *Val6 = Builder.CreateXor(Val2, Val5);
8207 llvm::Type *Val7 = llvm::FixedVectorType::get(HalfTy, 8);
8208 return Builder.CreateBitCast(Val6, Val7);
8209 }
8210 case ARM::BI__builtin_arm_mve_vqabsq_s16: {
8211 Value *Val0 = EmitScalarExpr(E->getArg(0));
8212 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8213 Value *Val2 = llvm::Constant::getNullValue(Val1);
8214 Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
8215 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8216 Value *Val5 = ARMMVEConstantSplat<1,0>(Builder, Val4);
8217 Value *Val6 = Builder.CreateICmpEQ(Val0, Val5);
8218 llvm::Type *Val7 = llvm::FixedVectorType::get(Int16Ty, 8);
8219 Value *Val8 = ARMMVEConstantSplat<0,1>(Builder, Val7);
8220 llvm::Type *Val9 = llvm::FixedVectorType::get(Int16Ty, 8);
8221 Value *Val10 = llvm::Constant::getNullValue(Val9);
8222 Value *Val11 = Builder.CreateSub(Val10, Val0);
8223 Value *Val12 = Builder.CreateSelect(Val6, Val8, Val11);
8224 return Builder.CreateSelect(Val3, Val0, Val12);
8225 }
8226 case ARM::BI__builtin_arm_mve_vabsq_s16: {
8227 Value *Val0 = EmitScalarExpr(E->getArg(0));
8228 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8229 Value *Val2 = llvm::Constant::getNullValue(Val1);
8230 Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
8231 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
8232 Value *Val5 = llvm::Constant::getNullValue(Val4);
8233 Value *Val6 = Builder.CreateSub(Val5, Val0);
8234 return Builder.CreateSelect(Val3, Val6, Val0);
8235 }
8236 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_f16:
8237 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_f32:
8238 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_s32:
8239 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_s64:
8240 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_s8:
8241 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u16:
8242 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u32:
8243 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u64:
8244 case ARM::BI__builtin_arm_mve_vreinterpretq_s16_u8:
8245 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_f16:
8246 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_f32:
8247 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s16:
8248 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s32:
8249 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s64:
8250 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_s8:
8251 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_u32:
8252 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_u64:
8253 case ARM::BI__builtin_arm_mve_vreinterpretq_u16_u8: {
8254 Value *Val0 = EmitScalarExpr(E->getArg(0));
8255 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8256 return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8257 }
8258 case ARM::BI__builtin_arm_mve_vcvtq_s16_f16: {
8259 Value *Val0 = EmitScalarExpr(E->getArg(0));
8260 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8261 return Builder.CreateFPToSI(Val0, Val1);
8262 }
8263 case ARM::BI__builtin_arm_mve_vcvtq_u16_f16: {
8264 Value *Val0 = EmitScalarExpr(E->getArg(0));
8265 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
8266 return Builder.CreateFPToUI(Val0, Val1);
8267 }
8268 case ARM::BI__builtin_arm_mve_vqnegq_s32: {
8269 Value *Val0 = EmitScalarExpr(E->getArg(0));
8270 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8271 Value *Val2 = ARMMVEConstantSplat<1,0>(Builder, Val1);
8272 Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
8273 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8274 Value *Val5 = ARMMVEConstantSplat<0,1>(Builder, Val4);
8275 llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
8276 Value *Val7 = llvm::Constant::getNullValue(Val6);
8277 Value *Val8 = Builder.CreateSub(Val7, Val0);
8278 return Builder.CreateSelect(Val3, Val5, Val8);
8279 }
8280 case ARM::BI__builtin_arm_mve_vmvnq_s32:
8281 case ARM::BI__builtin_arm_mve_vmvnq_u32: {
8282 Value *Val0 = EmitScalarExpr(E->getArg(0));
8283 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8284 Value *Val2 = ARMMVEConstantSplat<1,1>(Builder, Val1);
8285 return Builder.CreateXor(Val0, Val2);
8286 }
8287 case ARM::BI__builtin_arm_mve_vmovntq_s32:
8288 case ARM::BI__builtin_arm_mve_vmovntq_u32: {
8289 Value *Val0 = EmitScalarExpr(E->getArg(0));
8290 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8291 Value *Val2 = ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8292 Value *Val3 = EmitScalarExpr(E->getArg(1));
8293 Value *Val4 = VectorZip(Builder, Val2, Val3);
8294 llvm::Type *Val5 = llvm::FixedVectorType::get(Int16Ty, 8);
8295 return Builder.CreateTrunc(Val4, Val5);
8296 }
8297 case ARM::BI__builtin_arm_mve_vandq_f32: {
8298 Value *Val0 = EmitScalarExpr(E->getArg(0));
8299 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8300 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8301 Value *Val3 = EmitScalarExpr(E->getArg(1));
8302 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8303 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8304 Value *Val6 = Builder.CreateAnd(Val2, Val5);
8305 llvm::Type *Val7 = llvm::FixedVectorType::get(FloatTy, 4);
8306 return Builder.CreateBitCast(Val6, Val7);
8307 }
8308 case ARM::BI__builtin_arm_mve_vbicq_f32: {
8309 Value *Val0 = EmitScalarExpr(E->getArg(0));
8310 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8311 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8312 Value *Val3 = EmitScalarExpr(E->getArg(1));
8313 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8314 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8315 Value *Val6 = Builder.CreateNot(Val5);
8316 Value *Val7 = Builder.CreateAnd(Val2, Val6);
8317 llvm::Type *Val8 = llvm::FixedVectorType::get(FloatTy, 4);
8318 return Builder.CreateBitCast(Val7, Val8);
8319 }
8320 case ARM::BI__builtin_arm_mve_vornq_f32: {
8321 Value *Val0 = EmitScalarExpr(E->getArg(0));
8322 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8323 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8324 Value *Val3 = EmitScalarExpr(E->getArg(1));
8325 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8326 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8327 Value *Val6 = Builder.CreateNot(Val5);
8328 Value *Val7 = Builder.CreateOr(Val2, Val6);
8329 llvm::Type *Val8 = llvm::FixedVectorType::get(FloatTy, 4);
8330 return Builder.CreateBitCast(Val7, Val8);
8331 }
8332 case ARM::BI__builtin_arm_mve_vorrq_f32: {
8333 Value *Val0 = EmitScalarExpr(E->getArg(0));
8334 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8335 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8336 Value *Val3 = EmitScalarExpr(E->getArg(1));
8337 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8338 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8339 Value *Val6 = Builder.CreateOr(Val2, Val5);
8340 llvm::Type *Val7 = llvm::FixedVectorType::get(FloatTy, 4);
8341 return Builder.CreateBitCast(Val6, Val7);
8342 }
8343 case ARM::BI__builtin_arm_mve_veorq_f32: {
8344 Value *Val0 = EmitScalarExpr(E->getArg(0));
8345 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8346 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
8347 Value *Val3 = EmitScalarExpr(E->getArg(1));
8348 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8349 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
8350 Value *Val6 = Builder.CreateXor(Val2, Val5);
8351 llvm::Type *Val7 = llvm::FixedVectorType::get(FloatTy, 4);
8352 return Builder.CreateBitCast(Val6, Val7);
8353 }
8354 case ARM::BI__builtin_arm_mve_vqabsq_s32: {
8355 Value *Val0 = EmitScalarExpr(E->getArg(0));
8356 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8357 Value *Val2 = llvm::Constant::getNullValue(Val1);
8358 Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
8359 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8360 Value *Val5 = ARMMVEConstantSplat<1,0>(Builder, Val4);
8361 Value *Val6 = Builder.CreateICmpEQ(Val0, Val5);
8362 llvm::Type *Val7 = llvm::FixedVectorType::get(Int32Ty, 4);
8363 Value *Val8 = ARMMVEConstantSplat<0,1>(Builder, Val7);
8364 llvm::Type *Val9 = llvm::FixedVectorType::get(Int32Ty, 4);
8365 Value *Val10 = llvm::Constant::getNullValue(Val9);
8366 Value *Val11 = Builder.CreateSub(Val10, Val0);
8367 Value *Val12 = Builder.CreateSelect(Val6, Val8, Val11);
8368 return Builder.CreateSelect(Val3, Val0, Val12);
8369 }
8370 case ARM::BI__builtin_arm_mve_vabsq_s32: {
8371 Value *Val0 = EmitScalarExpr(E->getArg(0));
8372 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8373 Value *Val2 = llvm::Constant::getNullValue(Val1);
8374 Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
8375 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
8376 Value *Val5 = llvm::Constant::getNullValue(Val4);
8377 Value *Val6 = Builder.CreateSub(Val5, Val0);
8378 return Builder.CreateSelect(Val3, Val6, Val0);
8379 }
8380 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_f16:
8381 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_f32:
8382 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_s16:
8383 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_s64:
8384 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_s8:
8385 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u16:
8386 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u32:
8387 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u64:
8388 case ARM::BI__builtin_arm_mve_vreinterpretq_s32_u8:
8389 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_f16:
8390 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_f32:
8391 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s16:
8392 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s32:
8393 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s64:
8394 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_s8:
8395 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_u16:
8396 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_u64:
8397 case ARM::BI__builtin_arm_mve_vreinterpretq_u32_u8: {
8398 Value *Val0 = EmitScalarExpr(E->getArg(0));
8399 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8400 return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8401 }
8402 case ARM::BI__builtin_arm_mve_vcvtq_s32_f32: {
8403 Value *Val0 = EmitScalarExpr(E->getArg(0));
8404 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8405 return Builder.CreateFPToSI(Val0, Val1);
8406 }
8407 case ARM::BI__builtin_arm_mve_vcvtq_u32_f32: {
8408 Value *Val0 = EmitScalarExpr(E->getArg(0));
8409 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
8410 return Builder.CreateFPToUI(Val0, Val1);
8411 }
8412 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_f16:
8413 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_f32:
8414 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_s16:
8415 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_s32:
8416 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_s8:
8417 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u16:
8418 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u32:
8419 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u64:
8420 case ARM::BI__builtin_arm_mve_vreinterpretq_s64_u8:
8421 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_f16:
8422 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_f32:
8423 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s16:
8424 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s32:
8425 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s64:
8426 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_s8:
8427 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_u16:
8428 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_u32:
8429 case ARM::BI__builtin_arm_mve_vreinterpretq_u64_u8: {
8430 Value *Val0 = EmitScalarExpr(E->getArg(0));
8431 llvm::Type *Val1 = llvm::FixedVectorType::get(Int64Ty, 2);
8432 return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8433 }
8434 case ARM::BI__builtin_arm_mve_vqnegq_s8: {
8435 Value *Val0 = EmitScalarExpr(E->getArg(0));
8436 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
8437 Value *Val2 = ARMMVEConstantSplat<1,0>(Builder, Val1);
8438 Value *Val3 = Builder.CreateICmpEQ(Val0, Val2);
8439 llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
8440 Value *Val5 = ARMMVEConstantSplat<0,1>(Builder, Val4);
8441 llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
8442 Value *Val7 = llvm::Constant::getNullValue(Val6);
8443 Value *Val8 = Builder.CreateSub(Val7, Val0);
8444 return Builder.CreateSelect(Val3, Val5, Val8);
8445 }
8446 case ARM::BI__builtin_arm_mve_vmvnq_s8:
8447 case ARM::BI__builtin_arm_mve_vmvnq_u8: {
8448 Value *Val0 = EmitScalarExpr(E->getArg(0));
8449 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
8450 Value *Val2 = ARMMVEConstantSplat<1,1>(Builder, Val1);
8451 return Builder.CreateXor(Val0, Val2);
8452 }
8453 case ARM::BI__builtin_arm_mve_vqabsq_s8: {
8454 Value *Val0 = EmitScalarExpr(E->getArg(0));
8455 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
8456 Value *Val2 = llvm::Constant::getNullValue(Val1);
8457 Value *Val3 = Builder.CreateICmpSGT(Val0, Val2);
8458 llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
8459 Value *Val5 = ARMMVEConstantSplat<1,0>(Builder, Val4);
8460 Value *Val6 = Builder.CreateICmpEQ(Val0, Val5);
8461 llvm::Type *Val7 = llvm::FixedVectorType::get(Int8Ty, 16);
8462 Value *Val8 = ARMMVEConstantSplat<0,1>(Builder, Val7);
8463 llvm::Type *Val9 = llvm::FixedVectorType::get(Int8Ty, 16);
8464 Value *Val10 = llvm::Constant::getNullValue(Val9);
8465 Value *Val11 = Builder.CreateSub(Val10, Val0);
8466 Value *Val12 = Builder.CreateSelect(Val6, Val8, Val11);
8467 return Builder.CreateSelect(Val3, Val0, Val12);
8468 }
8469 case ARM::BI__builtin_arm_mve_vabsq_s8: {
8470 Value *Val0 = EmitScalarExpr(E->getArg(0));
8471 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
8472 Value *Val2 = llvm::Constant::getNullValue(Val1);
8473 Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
8474 llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
8475 Value *Val5 = llvm::Constant::getNullValue(Val4);
8476 Value *Val6 = Builder.CreateSub(Val5, Val0);
8477 return Builder.CreateSelect(Val3, Val6, Val0);
8478 }
8479 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_f16:
8480 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_f32:
8481 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_s16:
8482 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_s32:
8483 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_s64:
8484 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u16:
8485 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u32:
8486 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u64:
8487 case ARM::BI__builtin_arm_mve_vreinterpretq_s8_u8:
8488 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_f16:
8489 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_f32:
8490 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s16:
8491 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s32:
8492 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s64:
8493 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_s8:
8494 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_u16:
8495 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_u32:
8496 case ARM::BI__builtin_arm_mve_vreinterpretq_u8_u64: {
8497 Value *Val0 = EmitScalarExpr(E->getArg(0));
8498 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
8499 return ARMMVEVectorReinterpret(Builder, this, Val0, Val1);
8500 }
8501 case ARM::BI__builtin_arm_mve_vrev16q_s8:
8502 case ARM::BI__builtin_arm_mve_vrev16q_u8:
8503 case ARM::BI__builtin_arm_mve_vrev32q_f16:
8504 case ARM::BI__builtin_arm_mve_vrev32q_s16:
8505 case ARM::BI__builtin_arm_mve_vrev32q_s8:
8506 case ARM::BI__builtin_arm_mve_vrev32q_u16:
8507 case ARM::BI__builtin_arm_mve_vrev32q_u8:
8508 case ARM::BI__builtin_arm_mve_vrev64q_f16:
8509 case ARM::BI__builtin_arm_mve_vrev64q_f32:
8510 case ARM::BI__builtin_arm_mve_vrev64q_s16:
8511 case ARM::BI__builtin_arm_mve_vrev64q_s32:
8512 case ARM::BI__builtin_arm_mve_vrev64q_s8:
8513 case ARM::BI__builtin_arm_mve_vrev64q_u16:
8514 case ARM::BI__builtin_arm_mve_vrev64q_u32:
8515 case ARM::BI__builtin_arm_mve_vrev64q_u8: {
8516 unsigned Param0;
8517 switch (BuiltinID) {
8518 case ARM::BI__builtin_arm_mve_vrev16q_s8:
8519 Param0 = 16;
8520 break;
8521 case ARM::BI__builtin_arm_mve_vrev16q_u8:
8522 Param0 = 16;
8523 break;
8524 case ARM::BI__builtin_arm_mve_vrev32q_f16:
8525 Param0 = 32;
8526 break;
8527 case ARM::BI__builtin_arm_mve_vrev32q_s16:
8528 Param0 = 32;
8529 break;
8530 case ARM::BI__builtin_arm_mve_vrev32q_s8:
8531 Param0 = 32;
8532 break;
8533 case ARM::BI__builtin_arm_mve_vrev32q_u16:
8534 Param0 = 32;
8535 break;
8536 case ARM::BI__builtin_arm_mve_vrev32q_u8:
8537 Param0 = 32;
8538 break;
8539 case ARM::BI__builtin_arm_mve_vrev64q_f16:
8540 Param0 = 64;
8541 break;
8542 case ARM::BI__builtin_arm_mve_vrev64q_f32:
8543 Param0 = 64;
8544 break;
8545 case ARM::BI__builtin_arm_mve_vrev64q_s16:
8546 Param0 = 64;
8547 break;
8548 case ARM::BI__builtin_arm_mve_vrev64q_s32:
8549 Param0 = 64;
8550 break;
8551 case ARM::BI__builtin_arm_mve_vrev64q_s8:
8552 Param0 = 64;
8553 break;
8554 case ARM::BI__builtin_arm_mve_vrev64q_u16:
8555 Param0 = 64;
8556 break;
8557 case ARM::BI__builtin_arm_mve_vrev64q_u32:
8558 Param0 = 64;
8559 break;
8560 case ARM::BI__builtin_arm_mve_vrev64q_u8:
8561 Param0 = 64;
8562 break;
8563 }
8564 Value *Val0 = EmitScalarExpr(E->getArg(0));
8565 return ARMMVEVectorElementReverse(Builder, Val0, static_cast<unsigned>(Param0));
8566 }
8567 case ARM::BI__builtin_arm_mve_vdupq_n_f16:
8568 case ARM::BI__builtin_arm_mve_vdupq_n_f32:
8569 case ARM::BI__builtin_arm_mve_vdupq_n_s16:
8570 case ARM::BI__builtin_arm_mve_vdupq_n_s32:
8571 case ARM::BI__builtin_arm_mve_vdupq_n_s8:
8572 case ARM::BI__builtin_arm_mve_vdupq_n_u16:
8573 case ARM::BI__builtin_arm_mve_vdupq_n_u32:
8574 case ARM::BI__builtin_arm_mve_vdupq_n_u8: {
8575 Value *Val0 = EmitScalarExpr(E->getArg(0));
8576 return ARMMVEVectorSplat(Builder, Val0);
8577 }
8578 case ARM::BI__builtin_arm_mve_vabsq_f16:
8579 case ARM::BI__builtin_arm_mve_vabsq_f32:
8580 case ARM::BI__builtin_arm_mve_vclsq_s16:
8581 case ARM::BI__builtin_arm_mve_vclsq_s32:
8582 case ARM::BI__builtin_arm_mve_vclsq_s8:
8583 case ARM::BI__builtin_arm_mve_vrndaq_f16:
8584 case ARM::BI__builtin_arm_mve_vrndaq_f32:
8585 case ARM::BI__builtin_arm_mve_vrndmq_f16:
8586 case ARM::BI__builtin_arm_mve_vrndmq_f32:
8587 case ARM::BI__builtin_arm_mve_vrndnq_f16:
8588 case ARM::BI__builtin_arm_mve_vrndnq_f32:
8589 case ARM::BI__builtin_arm_mve_vrndpq_f16:
8590 case ARM::BI__builtin_arm_mve_vrndpq_f32:
8591 case ARM::BI__builtin_arm_mve_vrndq_f16:
8592 case ARM::BI__builtin_arm_mve_vrndq_f32:
8593 case ARM::BI__builtin_arm_mve_vrndxq_f16:
8594 case ARM::BI__builtin_arm_mve_vrndxq_f32: {
8595 Intrinsic::ID Param0;
8596 llvm::Type * Param1;
8597 switch (BuiltinID) {
8598 case ARM::BI__builtin_arm_mve_vabsq_f16:
8599 Param0 = Intrinsic::fabs;
8600 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8601 break;
8602 case ARM::BI__builtin_arm_mve_vabsq_f32:
8603 Param0 = Intrinsic::fabs;
8604 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8605 break;
8606 case ARM::BI__builtin_arm_mve_vclsq_s16:
8607 Param0 = Intrinsic::arm_mve_vcls;
8608 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
8609 break;
8610 case ARM::BI__builtin_arm_mve_vclsq_s32:
8611 Param0 = Intrinsic::arm_mve_vcls;
8612 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
8613 break;
8614 case ARM::BI__builtin_arm_mve_vclsq_s8:
8615 Param0 = Intrinsic::arm_mve_vcls;
8616 Param1 = llvm::FixedVectorType::get(Int8Ty, 16);
8617 break;
8618 case ARM::BI__builtin_arm_mve_vrndaq_f16:
8619 Param0 = Intrinsic::round;
8620 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8621 break;
8622 case ARM::BI__builtin_arm_mve_vrndaq_f32:
8623 Param0 = Intrinsic::round;
8624 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8625 break;
8626 case ARM::BI__builtin_arm_mve_vrndmq_f16:
8627 Param0 = Intrinsic::floor;
8628 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8629 break;
8630 case ARM::BI__builtin_arm_mve_vrndmq_f32:
8631 Param0 = Intrinsic::floor;
8632 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8633 break;
8634 case ARM::BI__builtin_arm_mve_vrndnq_f16:
8635 Param0 = Intrinsic::arm_mve_vrintn;
8636 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8637 break;
8638 case ARM::BI__builtin_arm_mve_vrndnq_f32:
8639 Param0 = Intrinsic::arm_mve_vrintn;
8640 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8641 break;
8642 case ARM::BI__builtin_arm_mve_vrndpq_f16:
8643 Param0 = Intrinsic::ceil;
8644 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8645 break;
8646 case ARM::BI__builtin_arm_mve_vrndpq_f32:
8647 Param0 = Intrinsic::ceil;
8648 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8649 break;
8650 case ARM::BI__builtin_arm_mve_vrndq_f16:
8651 Param0 = Intrinsic::trunc;
8652 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8653 break;
8654 case ARM::BI__builtin_arm_mve_vrndq_f32:
8655 Param0 = Intrinsic::trunc;
8656 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8657 break;
8658 case ARM::BI__builtin_arm_mve_vrndxq_f16:
8659 Param0 = Intrinsic::rint;
8660 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8661 break;
8662 case ARM::BI__builtin_arm_mve_vrndxq_f32:
8663 Param0 = Intrinsic::rint;
8664 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8665 break;
8666 }
8667 Value *Val0 = EmitScalarExpr(E->getArg(0));
8668 return Builder.CreateCall(CGM.getIntrinsic(Param0, {Param1}), {Val0});
8669 }
8670 case ARM::BI__builtin_arm_mve_vnegq_f16:
8671 case ARM::BI__builtin_arm_mve_vnegq_f32: {
8672 Value *Val0 = EmitScalarExpr(E->getArg(0));
8673 return Builder.CreateFNeg(Val0);
8674 }
8675 case ARM::BI__builtin_arm_mve_vshrq_n_s16:
8676 case ARM::BI__builtin_arm_mve_vshrq_n_s32:
8677 case ARM::BI__builtin_arm_mve_vshrq_n_s8:
8678 case ARM::BI__builtin_arm_mve_vshrq_n_u16:
8679 case ARM::BI__builtin_arm_mve_vshrq_n_u32:
8680 case ARM::BI__builtin_arm_mve_vshrq_n_u8: {
8681 bool Param0;
8682 switch (BuiltinID) {
8683 case ARM::BI__builtin_arm_mve_vshrq_n_s16:
8684 Param0 = 0;
8685 break;
8686 case ARM::BI__builtin_arm_mve_vshrq_n_s32:
8687 Param0 = 0;
8688 break;
8689 case ARM::BI__builtin_arm_mve_vshrq_n_s8:
8690 Param0 = 0;
8691 break;
8692 case ARM::BI__builtin_arm_mve_vshrq_n_u16:
8693 Param0 = 1;
8694 break;
8695 case ARM::BI__builtin_arm_mve_vshrq_n_u32:
8696 Param0 = 1;
8697 break;
8698 case ARM::BI__builtin_arm_mve_vshrq_n_u8:
8699 Param0 = 1;
8700 break;
8701 }
8702 Value *Val0 = EmitScalarExpr(E->getArg(0));
8703 return MVEImmediateShr(Builder, Val0, GetIntegerConstantValue<unsigned>(E->getArg(1), getContext()), static_cast<bool>(Param0));
8704 }
8705 case ARM::BI__builtin_arm_mve_vst1q_p_f16:
8706 case ARM::BI__builtin_arm_mve_vst1q_p_f32:
8707 case ARM::BI__builtin_arm_mve_vst1q_p_s16:
8708 case ARM::BI__builtin_arm_mve_vst1q_p_s32:
8709 case ARM::BI__builtin_arm_mve_vst1q_p_s8:
8710 case ARM::BI__builtin_arm_mve_vst1q_p_u16:
8711 case ARM::BI__builtin_arm_mve_vst1q_p_u32:
8712 case ARM::BI__builtin_arm_mve_vst1q_p_u8:
8713 case ARM::BI__builtin_arm_mve_vstrbq_p_s8:
8714 case ARM::BI__builtin_arm_mve_vstrbq_p_u8:
8715 case ARM::BI__builtin_arm_mve_vstrhq_p_f16:
8716 case ARM::BI__builtin_arm_mve_vstrhq_p_s16:
8717 case ARM::BI__builtin_arm_mve_vstrhq_p_u16:
8718 case ARM::BI__builtin_arm_mve_vstrwq_p_f32:
8719 case ARM::BI__builtin_arm_mve_vstrwq_p_s32:
8720 case ARM::BI__builtin_arm_mve_vstrwq_p_u32: {
8721 llvm::Type * Param0;
8722 uint32_t Param1;
8723 llvm::Type * Param2;
8724 llvm::Type * Param3;
8725 switch (BuiltinID) {
8726 case ARM::BI__builtin_arm_mve_vst1q_p_f16:
8727 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8));
8728 Param1 = 2;
8729 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8730 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
8731 break;
8732 case ARM::BI__builtin_arm_mve_vst1q_p_f32:
8733 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4));
8734 Param1 = 4;
8735 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8736 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
8737 break;
8738 case ARM::BI__builtin_arm_mve_vst1q_p_s16:
8739 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
8740 Param1 = 2;
8741 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8742 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
8743 break;
8744 case ARM::BI__builtin_arm_mve_vst1q_p_s32:
8745 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
8746 Param1 = 4;
8747 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8748 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
8749 break;
8750 case ARM::BI__builtin_arm_mve_vst1q_p_s8:
8751 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
8752 Param1 = 1;
8753 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
8754 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
8755 break;
8756 case ARM::BI__builtin_arm_mve_vst1q_p_u16:
8757 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
8758 Param1 = 2;
8759 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8760 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
8761 break;
8762 case ARM::BI__builtin_arm_mve_vst1q_p_u32:
8763 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
8764 Param1 = 4;
8765 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8766 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
8767 break;
8768 case ARM::BI__builtin_arm_mve_vst1q_p_u8:
8769 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
8770 Param1 = 1;
8771 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
8772 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
8773 break;
8774 case ARM::BI__builtin_arm_mve_vstrbq_p_s8:
8775 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
8776 Param1 = 1;
8777 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
8778 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
8779 break;
8780 case ARM::BI__builtin_arm_mve_vstrbq_p_u8:
8781 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16));
8782 Param1 = 1;
8783 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
8784 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
8785 break;
8786 case ARM::BI__builtin_arm_mve_vstrhq_p_f16:
8787 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8));
8788 Param1 = 2;
8789 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8790 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
8791 break;
8792 case ARM::BI__builtin_arm_mve_vstrhq_p_s16:
8793 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
8794 Param1 = 2;
8795 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8796 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
8797 break;
8798 case ARM::BI__builtin_arm_mve_vstrhq_p_u16:
8799 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8));
8800 Param1 = 2;
8801 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8802 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
8803 break;
8804 case ARM::BI__builtin_arm_mve_vstrwq_p_f32:
8805 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4));
8806 Param1 = 4;
8807 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8808 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
8809 break;
8810 case ARM::BI__builtin_arm_mve_vstrwq_p_s32:
8811 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
8812 Param1 = 4;
8813 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8814 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
8815 break;
8816 case ARM::BI__builtin_arm_mve_vstrwq_p_u32:
8817 Param0 = llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4));
8818 Param1 = 4;
8819 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8820 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
8821 break;
8822 }
8823 Value *Val0 = EmitScalarExpr(E->getArg(1));
8824 Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8825 Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), Param0);
8826 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
8827 Value *Val4 = EmitScalarExpr(E->getArg(2));
8828 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
8829 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val5});
8830 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_store, {Param3, Param0}), {Val0, Val2, Val3, Val6});
8831 }
8832 case ARM::BI__builtin_arm_mve_vst1q_f32:
8833 case ARM::BI__builtin_arm_mve_vstrwq_f32: {
8834 Value *Val0 = EmitScalarExpr(E->getArg(1));
8835 Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8836 Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(FloatTy, 4)));
8837 Address Val3 = Address(Val2, llvm::FixedVectorType::get(FloatTy, 4), CharUnits::fromQuantity(4));
8838 return Builder.CreateStore(Val0, Val3);
8839 }
8840 case ARM::BI__builtin_arm_mve_vst1q_f16:
8841 case ARM::BI__builtin_arm_mve_vstrhq_f16: {
8842 Value *Val0 = EmitScalarExpr(E->getArg(1));
8843 Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8844 Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(HalfTy, 8)));
8845 Address Val3 = Address(Val2, llvm::FixedVectorType::get(HalfTy, 8), CharUnits::fromQuantity(2));
8846 return Builder.CreateStore(Val0, Val3);
8847 }
8848 case ARM::BI__builtin_arm_mve_vst1q_s16:
8849 case ARM::BI__builtin_arm_mve_vst1q_u16:
8850 case ARM::BI__builtin_arm_mve_vstrhq_s16:
8851 case ARM::BI__builtin_arm_mve_vstrhq_u16: {
8852 Value *Val0 = EmitScalarExpr(E->getArg(1));
8853 Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8854 Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 8)));
8855 Address Val3 = Address(Val2, llvm::FixedVectorType::get(Int16Ty, 8), CharUnits::fromQuantity(2));
8856 return Builder.CreateStore(Val0, Val3);
8857 }
8858 case ARM::BI__builtin_arm_mve_vst1q_s32:
8859 case ARM::BI__builtin_arm_mve_vst1q_u32:
8860 case ARM::BI__builtin_arm_mve_vstrwq_s32:
8861 case ARM::BI__builtin_arm_mve_vstrwq_u32: {
8862 Value *Val0 = EmitScalarExpr(E->getArg(1));
8863 Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8864 Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int32Ty, 4)));
8865 Address Val3 = Address(Val2, llvm::FixedVectorType::get(Int32Ty, 4), CharUnits::fromQuantity(4));
8866 return Builder.CreateStore(Val0, Val3);
8867 }
8868 case ARM::BI__builtin_arm_mve_vst1q_s8:
8869 case ARM::BI__builtin_arm_mve_vst1q_u8:
8870 case ARM::BI__builtin_arm_mve_vstrbq_s8:
8871 case ARM::BI__builtin_arm_mve_vstrbq_u8: {
8872 Value *Val0 = EmitScalarExpr(E->getArg(1));
8873 Address Val1 = EmitPointerWithAlignment(E->getArg(0));
8874 Value *Val2 = Builder.CreatePointerCast((Val1.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 16)));
8875 Address Val3 = Address(Val2, llvm::FixedVectorType::get(Int8Ty, 16), CharUnits::fromQuantity(1));
8876 return Builder.CreateStore(Val0, Val3);
8877 }
8878 case ARM::BI__builtin_arm_mve_vctp16q_m:
8879 case ARM::BI__builtin_arm_mve_vctp32q_m:
8880 case ARM::BI__builtin_arm_mve_vctp64q_m:
8881 case ARM::BI__builtin_arm_mve_vctp8q_m: {
8882 llvm::Type * Param0;
8883 Intrinsic::ID Param1;
8884 switch (BuiltinID) {
8885 case ARM::BI__builtin_arm_mve_vctp16q_m:
8886 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8887 Param1 = Intrinsic::arm_mve_vctp16;
8888 break;
8889 case ARM::BI__builtin_arm_mve_vctp32q_m:
8890 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8891 Param1 = Intrinsic::arm_mve_vctp32;
8892 break;
8893 case ARM::BI__builtin_arm_mve_vctp64q_m:
8894 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
8895 Param1 = Intrinsic::arm_mve_vctp64;
8896 break;
8897 case ARM::BI__builtin_arm_mve_vctp8q_m:
8898 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
8899 Param1 = Intrinsic::arm_mve_vctp8;
8900 break;
8901 }
8902 Value *Val0 = EmitScalarExpr(E->getArg(1));
8903 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
8904 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
8905 Value *Val3 = EmitScalarExpr(E->getArg(0));
8906 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Param1), {Val3});
8907 Value *Val5 = Builder.CreateAnd(Val2, Val4);
8908 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val5});
8909 return Builder.CreateIntCast(Val6, Int16Ty, false);
8910 }
8911 case ARM::BI__builtin_arm_mve_vmovnbq_s16:
8912 case ARM::BI__builtin_arm_mve_vmovnbq_u16: {
8913 Value *Val0 = EmitScalarExpr(E->getArg(1));
8914 Value *Val1 = EmitScalarExpr(E->getArg(0));
8915 Value *Val2 = ARMMVEVectorElementReverse(Builder, Val1, static_cast<unsigned>(16));
8916 llvm::Type *Val3 = llvm::FixedVectorType::get(Int16Ty, 8);
8917 Value *Val4 = ARMMVEVectorReinterpret(Builder, this, Val2, Val3);
8918 Value *Val5 = VectorZip(Builder, Val0, Val4);
8919 llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
8920 return Builder.CreateTrunc(Val5, Val6);
8921 }
8922 case ARM::BI__builtin_arm_mve_vmovnbq_s32:
8923 case ARM::BI__builtin_arm_mve_vmovnbq_u32: {
8924 Value *Val0 = EmitScalarExpr(E->getArg(1));
8925 Value *Val1 = EmitScalarExpr(E->getArg(0));
8926 Value *Val2 = ARMMVEVectorElementReverse(Builder, Val1, static_cast<unsigned>(32));
8927 llvm::Type *Val3 = llvm::FixedVectorType::get(Int32Ty, 4);
8928 Value *Val4 = ARMMVEVectorReinterpret(Builder, this, Val2, Val3);
8929 Value *Val5 = VectorZip(Builder, Val0, Val4);
8930 llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
8931 return Builder.CreateTrunc(Val5, Val6);
8932 }
8933 case ARM::BI__builtin_arm_mve_vsetq_lane_f16:
8934 case ARM::BI__builtin_arm_mve_vsetq_lane_f32:
8935 case ARM::BI__builtin_arm_mve_vsetq_lane_s16:
8936 case ARM::BI__builtin_arm_mve_vsetq_lane_s32:
8937 case ARM::BI__builtin_arm_mve_vsetq_lane_s64:
8938 case ARM::BI__builtin_arm_mve_vsetq_lane_s8:
8939 case ARM::BI__builtin_arm_mve_vsetq_lane_u16:
8940 case ARM::BI__builtin_arm_mve_vsetq_lane_u32:
8941 case ARM::BI__builtin_arm_mve_vsetq_lane_u64:
8942 case ARM::BI__builtin_arm_mve_vsetq_lane_u8: {
8943 Value *Val0 = EmitScalarExpr(E->getArg(1));
8944 Value *Val1 = EmitScalarExpr(E->getArg(0));
8945 Value *Val2 = EmitScalarExpr(E->getArg(2));
8946 return Builder.CreateInsertElement(Val0, Val1, Val2);
8947 }
8948 case ARM::BI__builtin_arm_mve_vfmaq_m_f16:
8949 case ARM::BI__builtin_arm_mve_vfmaq_m_f32: {
8950 llvm::Type * Param0;
8951 llvm::Type * Param1;
8952 switch (BuiltinID) {
8953 case ARM::BI__builtin_arm_mve_vfmaq_m_f16:
8954 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
8955 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
8956 break;
8957 case ARM::BI__builtin_arm_mve_vfmaq_m_f32:
8958 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
8959 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
8960 break;
8961 }
8962 Value *Val0 = EmitScalarExpr(E->getArg(1));
8963 Value *Val1 = EmitScalarExpr(E->getArg(2));
8964 Value *Val2 = (Val1);
8965 Value *Val3 = EmitScalarExpr(E->getArg(0));
8966 Value *Val4 = EmitScalarExpr(E->getArg(3));
8967 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
8968 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
8969 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_fma_predicated, {Param1, Param0}), {Val0, Val2, Val3, Val6});
8970 }
8971 case ARM::BI__builtin_arm_mve_vfmaq_f16:
8972 case ARM::BI__builtin_arm_mve_vfmaq_f32: {
8973 llvm::Type * Param0;
8974 switch (BuiltinID) {
8975 case ARM::BI__builtin_arm_mve_vfmaq_f16:
8976 Param0 = llvm::FixedVectorType::get(HalfTy, 8);
8977 break;
8978 case ARM::BI__builtin_arm_mve_vfmaq_f32:
8979 Param0 = llvm::FixedVectorType::get(FloatTy, 4);
8980 break;
8981 }
8982 Value *Val0 = EmitScalarExpr(E->getArg(1));
8983 Value *Val1 = EmitScalarExpr(E->getArg(2));
8984 Value *Val2 = (Val1);
8985 Value *Val3 = EmitScalarExpr(E->getArg(0));
8986 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val0, Val2, Val3});
8987 }
8988 case ARM::BI__builtin_arm_mve_vmlaq_n_s16:
8989 case ARM::BI__builtin_arm_mve_vmlaq_n_s32:
8990 case ARM::BI__builtin_arm_mve_vmlaq_n_s8:
8991 case ARM::BI__builtin_arm_mve_vmlaq_n_u16:
8992 case ARM::BI__builtin_arm_mve_vmlaq_n_u32:
8993 case ARM::BI__builtin_arm_mve_vmlaq_n_u8: {
8994 Value *Val0 = EmitScalarExpr(E->getArg(1));
8995 Value *Val1 = EmitScalarExpr(E->getArg(2));
8996 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
8997 Value *Val3 = Builder.CreateMul(Val0, Val2);
8998 Value *Val4 = EmitScalarExpr(E->getArg(0));
8999 return Builder.CreateAdd(Val3, Val4);
9000 }
9001 case ARM::BI__builtin_arm_mve_vaddq_m_n_f16:
9002 case ARM::BI__builtin_arm_mve_vaddq_m_n_f32:
9003 case ARM::BI__builtin_arm_mve_vaddq_m_n_s16:
9004 case ARM::BI__builtin_arm_mve_vaddq_m_n_s32:
9005 case ARM::BI__builtin_arm_mve_vaddq_m_n_s8:
9006 case ARM::BI__builtin_arm_mve_vaddq_m_n_u16:
9007 case ARM::BI__builtin_arm_mve_vaddq_m_n_u32:
9008 case ARM::BI__builtin_arm_mve_vaddq_m_n_u8:
9009 case ARM::BI__builtin_arm_mve_vmulq_m_n_f16:
9010 case ARM::BI__builtin_arm_mve_vmulq_m_n_f32:
9011 case ARM::BI__builtin_arm_mve_vmulq_m_n_s16:
9012 case ARM::BI__builtin_arm_mve_vmulq_m_n_s32:
9013 case ARM::BI__builtin_arm_mve_vmulq_m_n_s8:
9014 case ARM::BI__builtin_arm_mve_vmulq_m_n_u16:
9015 case ARM::BI__builtin_arm_mve_vmulq_m_n_u32:
9016 case ARM::BI__builtin_arm_mve_vmulq_m_n_u8:
9017 case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s16:
9018 case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s32:
9019 case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s8:
9020 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s16:
9021 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s32:
9022 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s8:
9023 case ARM::BI__builtin_arm_mve_vsubq_m_n_f16:
9024 case ARM::BI__builtin_arm_mve_vsubq_m_n_f32:
9025 case ARM::BI__builtin_arm_mve_vsubq_m_n_s16:
9026 case ARM::BI__builtin_arm_mve_vsubq_m_n_s32:
9027 case ARM::BI__builtin_arm_mve_vsubq_m_n_s8:
9028 case ARM::BI__builtin_arm_mve_vsubq_m_n_u16:
9029 case ARM::BI__builtin_arm_mve_vsubq_m_n_u32:
9030 case ARM::BI__builtin_arm_mve_vsubq_m_n_u8: {
9031 llvm::Type * Param0;
9032 Intrinsic::ID Param1;
9033 llvm::Type * Param2;
9034 switch (BuiltinID) {
9035 case ARM::BI__builtin_arm_mve_vaddq_m_n_f16:
9036 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9037 Param1 = Intrinsic::arm_mve_add_predicated;
9038 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9039 break;
9040 case ARM::BI__builtin_arm_mve_vaddq_m_n_f32:
9041 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9042 Param1 = Intrinsic::arm_mve_add_predicated;
9043 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9044 break;
9045 case ARM::BI__builtin_arm_mve_vaddq_m_n_s16:
9046 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9047 Param1 = Intrinsic::arm_mve_add_predicated;
9048 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9049 break;
9050 case ARM::BI__builtin_arm_mve_vaddq_m_n_s32:
9051 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9052 Param1 = Intrinsic::arm_mve_add_predicated;
9053 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9054 break;
9055 case ARM::BI__builtin_arm_mve_vaddq_m_n_s8:
9056 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9057 Param1 = Intrinsic::arm_mve_add_predicated;
9058 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9059 break;
9060 case ARM::BI__builtin_arm_mve_vaddq_m_n_u16:
9061 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9062 Param1 = Intrinsic::arm_mve_add_predicated;
9063 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9064 break;
9065 case ARM::BI__builtin_arm_mve_vaddq_m_n_u32:
9066 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9067 Param1 = Intrinsic::arm_mve_add_predicated;
9068 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9069 break;
9070 case ARM::BI__builtin_arm_mve_vaddq_m_n_u8:
9071 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9072 Param1 = Intrinsic::arm_mve_add_predicated;
9073 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9074 break;
9075 case ARM::BI__builtin_arm_mve_vmulq_m_n_f16:
9076 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9077 Param1 = Intrinsic::arm_mve_mul_predicated;
9078 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9079 break;
9080 case ARM::BI__builtin_arm_mve_vmulq_m_n_f32:
9081 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9082 Param1 = Intrinsic::arm_mve_mul_predicated;
9083 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9084 break;
9085 case ARM::BI__builtin_arm_mve_vmulq_m_n_s16:
9086 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9087 Param1 = Intrinsic::arm_mve_mul_predicated;
9088 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9089 break;
9090 case ARM::BI__builtin_arm_mve_vmulq_m_n_s32:
9091 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9092 Param1 = Intrinsic::arm_mve_mul_predicated;
9093 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9094 break;
9095 case ARM::BI__builtin_arm_mve_vmulq_m_n_s8:
9096 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9097 Param1 = Intrinsic::arm_mve_mul_predicated;
9098 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9099 break;
9100 case ARM::BI__builtin_arm_mve_vmulq_m_n_u16:
9101 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9102 Param1 = Intrinsic::arm_mve_mul_predicated;
9103 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9104 break;
9105 case ARM::BI__builtin_arm_mve_vmulq_m_n_u32:
9106 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9107 Param1 = Intrinsic::arm_mve_mul_predicated;
9108 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9109 break;
9110 case ARM::BI__builtin_arm_mve_vmulq_m_n_u8:
9111 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9112 Param1 = Intrinsic::arm_mve_mul_predicated;
9113 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9114 break;
9115 case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s16:
9116 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9117 Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9118 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9119 break;
9120 case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s32:
9121 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9122 Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9123 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9124 break;
9125 case ARM::BI__builtin_arm_mve_vqdmulhq_m_n_s8:
9126 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9127 Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9128 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9129 break;
9130 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s16:
9131 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9132 Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9133 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9134 break;
9135 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s32:
9136 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9137 Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9138 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9139 break;
9140 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_n_s8:
9141 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9142 Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9143 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9144 break;
9145 case ARM::BI__builtin_arm_mve_vsubq_m_n_f16:
9146 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9147 Param1 = Intrinsic::arm_mve_sub_predicated;
9148 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9149 break;
9150 case ARM::BI__builtin_arm_mve_vsubq_m_n_f32:
9151 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9152 Param1 = Intrinsic::arm_mve_sub_predicated;
9153 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9154 break;
9155 case ARM::BI__builtin_arm_mve_vsubq_m_n_s16:
9156 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9157 Param1 = Intrinsic::arm_mve_sub_predicated;
9158 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9159 break;
9160 case ARM::BI__builtin_arm_mve_vsubq_m_n_s32:
9161 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9162 Param1 = Intrinsic::arm_mve_sub_predicated;
9163 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9164 break;
9165 case ARM::BI__builtin_arm_mve_vsubq_m_n_s8:
9166 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9167 Param1 = Intrinsic::arm_mve_sub_predicated;
9168 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9169 break;
9170 case ARM::BI__builtin_arm_mve_vsubq_m_n_u16:
9171 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9172 Param1 = Intrinsic::arm_mve_sub_predicated;
9173 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9174 break;
9175 case ARM::BI__builtin_arm_mve_vsubq_m_n_u32:
9176 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9177 Param1 = Intrinsic::arm_mve_sub_predicated;
9178 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9179 break;
9180 case ARM::BI__builtin_arm_mve_vsubq_m_n_u8:
9181 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9182 Param1 = Intrinsic::arm_mve_sub_predicated;
9183 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9184 break;
9185 }
9186 Value *Val0 = EmitScalarExpr(E->getArg(1));
9187 Value *Val1 = EmitScalarExpr(E->getArg(2));
9188 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
9189 Value *Val3 = EmitScalarExpr(E->getArg(3));
9190 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
9191 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val4});
9192 Value *Val6 = EmitScalarExpr(E->getArg(0));
9193 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val2, Val5, Val6});
9194 }
9195 case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s16:
9196 case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s32:
9197 case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s16:
9198 case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s32: {
9199 uint32_t Param0;
9200 llvm::Type * Param1;
9201 llvm::Type * Param2;
9202 llvm::Type * Param3;
9203 switch (BuiltinID) {
9204 case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s16:
9205 Param0 = 0;
9206 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9207 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9208 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9209 break;
9210 case ARM::BI__builtin_arm_mve_vqdmullbq_m_n_s32:
9211 Param0 = 0;
9212 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
9213 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
9214 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9215 break;
9216 case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s16:
9217 Param0 = 1;
9218 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9219 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9220 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9221 break;
9222 case ARM::BI__builtin_arm_mve_vqdmulltq_m_n_s32:
9223 Param0 = 1;
9224 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
9225 Param2 = llvm::FixedVectorType::get(Int64Ty, 2);
9226 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9227 break;
9228 }
9229 Value *Val0 = EmitScalarExpr(E->getArg(1));
9230 Value *Val1 = EmitScalarExpr(E->getArg(2));
9231 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
9232 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
9233 Value *Val4 = EmitScalarExpr(E->getArg(3));
9234 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
9235 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
9236 Value *Val7 = EmitScalarExpr(E->getArg(0));
9237 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vqdmull_predicated, {Param2, Param3, Param1}), {Val0, Val2, Val3, Val6, Val7});
9238 }
9239 case ARM::BI__builtin_arm_mve_vhaddq_m_n_s16:
9240 case ARM::BI__builtin_arm_mve_vhaddq_m_n_s32:
9241 case ARM::BI__builtin_arm_mve_vhaddq_m_n_s8:
9242 case ARM::BI__builtin_arm_mve_vhaddq_m_n_u16:
9243 case ARM::BI__builtin_arm_mve_vhaddq_m_n_u32:
9244 case ARM::BI__builtin_arm_mve_vhaddq_m_n_u8:
9245 case ARM::BI__builtin_arm_mve_vhsubq_m_n_s16:
9246 case ARM::BI__builtin_arm_mve_vhsubq_m_n_s32:
9247 case ARM::BI__builtin_arm_mve_vhsubq_m_n_s8:
9248 case ARM::BI__builtin_arm_mve_vhsubq_m_n_u16:
9249 case ARM::BI__builtin_arm_mve_vhsubq_m_n_u32:
9250 case ARM::BI__builtin_arm_mve_vhsubq_m_n_u8:
9251 case ARM::BI__builtin_arm_mve_vqaddq_m_n_s16:
9252 case ARM::BI__builtin_arm_mve_vqaddq_m_n_s32:
9253 case ARM::BI__builtin_arm_mve_vqaddq_m_n_s8:
9254 case ARM::BI__builtin_arm_mve_vqaddq_m_n_u16:
9255 case ARM::BI__builtin_arm_mve_vqaddq_m_n_u32:
9256 case ARM::BI__builtin_arm_mve_vqaddq_m_n_u8:
9257 case ARM::BI__builtin_arm_mve_vqsubq_m_n_s16:
9258 case ARM::BI__builtin_arm_mve_vqsubq_m_n_s32:
9259 case ARM::BI__builtin_arm_mve_vqsubq_m_n_s8:
9260 case ARM::BI__builtin_arm_mve_vqsubq_m_n_u16:
9261 case ARM::BI__builtin_arm_mve_vqsubq_m_n_u32:
9262 case ARM::BI__builtin_arm_mve_vqsubq_m_n_u8: {
9263 uint32_t Param0;
9264 llvm::Type * Param1;
9265 Intrinsic::ID Param2;
9266 llvm::Type * Param3;
9267 switch (BuiltinID) {
9268 case ARM::BI__builtin_arm_mve_vhaddq_m_n_s16:
9269 Param0 = 0;
9270 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9271 Param2 = Intrinsic::arm_mve_hadd_predicated;
9272 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9273 break;
9274 case ARM::BI__builtin_arm_mve_vhaddq_m_n_s32:
9275 Param0 = 0;
9276 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9277 Param2 = Intrinsic::arm_mve_hadd_predicated;
9278 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9279 break;
9280 case ARM::BI__builtin_arm_mve_vhaddq_m_n_s8:
9281 Param0 = 0;
9282 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9283 Param2 = Intrinsic::arm_mve_hadd_predicated;
9284 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9285 break;
9286 case ARM::BI__builtin_arm_mve_vhaddq_m_n_u16:
9287 Param0 = 1;
9288 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9289 Param2 = Intrinsic::arm_mve_hadd_predicated;
9290 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9291 break;
9292 case ARM::BI__builtin_arm_mve_vhaddq_m_n_u32:
9293 Param0 = 1;
9294 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9295 Param2 = Intrinsic::arm_mve_hadd_predicated;
9296 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9297 break;
9298 case ARM::BI__builtin_arm_mve_vhaddq_m_n_u8:
9299 Param0 = 1;
9300 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9301 Param2 = Intrinsic::arm_mve_hadd_predicated;
9302 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9303 break;
9304 case ARM::BI__builtin_arm_mve_vhsubq_m_n_s16:
9305 Param0 = 0;
9306 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9307 Param2 = Intrinsic::arm_mve_hsub_predicated;
9308 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9309 break;
9310 case ARM::BI__builtin_arm_mve_vhsubq_m_n_s32:
9311 Param0 = 0;
9312 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9313 Param2 = Intrinsic::arm_mve_hsub_predicated;
9314 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9315 break;
9316 case ARM::BI__builtin_arm_mve_vhsubq_m_n_s8:
9317 Param0 = 0;
9318 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9319 Param2 = Intrinsic::arm_mve_hsub_predicated;
9320 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9321 break;
9322 case ARM::BI__builtin_arm_mve_vhsubq_m_n_u16:
9323 Param0 = 1;
9324 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9325 Param2 = Intrinsic::arm_mve_hsub_predicated;
9326 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9327 break;
9328 case ARM::BI__builtin_arm_mve_vhsubq_m_n_u32:
9329 Param0 = 1;
9330 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9331 Param2 = Intrinsic::arm_mve_hsub_predicated;
9332 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9333 break;
9334 case ARM::BI__builtin_arm_mve_vhsubq_m_n_u8:
9335 Param0 = 1;
9336 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9337 Param2 = Intrinsic::arm_mve_hsub_predicated;
9338 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9339 break;
9340 case ARM::BI__builtin_arm_mve_vqaddq_m_n_s16:
9341 Param0 = 0;
9342 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9343 Param2 = Intrinsic::arm_mve_qadd_predicated;
9344 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9345 break;
9346 case ARM::BI__builtin_arm_mve_vqaddq_m_n_s32:
9347 Param0 = 0;
9348 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9349 Param2 = Intrinsic::arm_mve_qadd_predicated;
9350 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9351 break;
9352 case ARM::BI__builtin_arm_mve_vqaddq_m_n_s8:
9353 Param0 = 0;
9354 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9355 Param2 = Intrinsic::arm_mve_qadd_predicated;
9356 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9357 break;
9358 case ARM::BI__builtin_arm_mve_vqaddq_m_n_u16:
9359 Param0 = 1;
9360 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9361 Param2 = Intrinsic::arm_mve_qadd_predicated;
9362 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9363 break;
9364 case ARM::BI__builtin_arm_mve_vqaddq_m_n_u32:
9365 Param0 = 1;
9366 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9367 Param2 = Intrinsic::arm_mve_qadd_predicated;
9368 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9369 break;
9370 case ARM::BI__builtin_arm_mve_vqaddq_m_n_u8:
9371 Param0 = 1;
9372 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9373 Param2 = Intrinsic::arm_mve_qadd_predicated;
9374 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9375 break;
9376 case ARM::BI__builtin_arm_mve_vqsubq_m_n_s16:
9377 Param0 = 0;
9378 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9379 Param2 = Intrinsic::arm_mve_qsub_predicated;
9380 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9381 break;
9382 case ARM::BI__builtin_arm_mve_vqsubq_m_n_s32:
9383 Param0 = 0;
9384 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9385 Param2 = Intrinsic::arm_mve_qsub_predicated;
9386 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9387 break;
9388 case ARM::BI__builtin_arm_mve_vqsubq_m_n_s8:
9389 Param0 = 0;
9390 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9391 Param2 = Intrinsic::arm_mve_qsub_predicated;
9392 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9393 break;
9394 case ARM::BI__builtin_arm_mve_vqsubq_m_n_u16:
9395 Param0 = 1;
9396 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9397 Param2 = Intrinsic::arm_mve_qsub_predicated;
9398 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
9399 break;
9400 case ARM::BI__builtin_arm_mve_vqsubq_m_n_u32:
9401 Param0 = 1;
9402 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9403 Param2 = Intrinsic::arm_mve_qsub_predicated;
9404 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
9405 break;
9406 case ARM::BI__builtin_arm_mve_vqsubq_m_n_u8:
9407 Param0 = 1;
9408 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9409 Param2 = Intrinsic::arm_mve_qsub_predicated;
9410 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
9411 break;
9412 }
9413 Value *Val0 = EmitScalarExpr(E->getArg(1));
9414 Value *Val1 = EmitScalarExpr(E->getArg(2));
9415 Value *Val2 = ARMMVEVectorSplat(Builder, Val1);
9416 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
9417 Value *Val4 = EmitScalarExpr(E->getArg(3));
9418 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
9419 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
9420 Value *Val7 = EmitScalarExpr(E->getArg(0));
9421 return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val2, Val3, Val6, Val7});
9422 }
9423 case ARM::BI__builtin_arm_mve_vfmsq_m_f16:
9424 case ARM::BI__builtin_arm_mve_vfmsq_m_f32: {
9425 llvm::Type * Param0;
9426 llvm::Type * Param1;
9427 switch (BuiltinID) {
9428 case ARM::BI__builtin_arm_mve_vfmsq_m_f16:
9429 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9430 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
9431 break;
9432 case ARM::BI__builtin_arm_mve_vfmsq_m_f32:
9433 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9434 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
9435 break;
9436 }
9437 Value *Val0 = EmitScalarExpr(E->getArg(1));
9438 Value *Val1 = EmitScalarExpr(E->getArg(2));
9439 Value *Val2 = Builder.CreateFNeg(Val1);
9440 Value *Val3 = EmitScalarExpr(E->getArg(0));
9441 Value *Val4 = EmitScalarExpr(E->getArg(3));
9442 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
9443 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val5});
9444 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_fma_predicated, {Param1, Param0}), {Val0, Val2, Val3, Val6});
9445 }
9446 case ARM::BI__builtin_arm_mve_vfmsq_f16:
9447 case ARM::BI__builtin_arm_mve_vfmsq_f32: {
9448 llvm::Type * Param0;
9449 switch (BuiltinID) {
9450 case ARM::BI__builtin_arm_mve_vfmsq_f16:
9451 Param0 = llvm::FixedVectorType::get(HalfTy, 8);
9452 break;
9453 case ARM::BI__builtin_arm_mve_vfmsq_f32:
9454 Param0 = llvm::FixedVectorType::get(FloatTy, 4);
9455 break;
9456 }
9457 Value *Val0 = EmitScalarExpr(E->getArg(1));
9458 Value *Val1 = EmitScalarExpr(E->getArg(2));
9459 Value *Val2 = Builder.CreateFNeg(Val1);
9460 Value *Val3 = EmitScalarExpr(E->getArg(0));
9461 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val0, Val2, Val3});
9462 }
9463 case ARM::BI__builtin_arm_mve_vabsq_m_f16:
9464 case ARM::BI__builtin_arm_mve_vabsq_m_f32:
9465 case ARM::BI__builtin_arm_mve_vabsq_m_s16:
9466 case ARM::BI__builtin_arm_mve_vabsq_m_s32:
9467 case ARM::BI__builtin_arm_mve_vabsq_m_s8:
9468 case ARM::BI__builtin_arm_mve_vclsq_m_s16:
9469 case ARM::BI__builtin_arm_mve_vclsq_m_s32:
9470 case ARM::BI__builtin_arm_mve_vclsq_m_s8:
9471 case ARM::BI__builtin_arm_mve_vclzq_m_s16:
9472 case ARM::BI__builtin_arm_mve_vclzq_m_s32:
9473 case ARM::BI__builtin_arm_mve_vclzq_m_s8:
9474 case ARM::BI__builtin_arm_mve_vclzq_m_u16:
9475 case ARM::BI__builtin_arm_mve_vclzq_m_u32:
9476 case ARM::BI__builtin_arm_mve_vclzq_m_u8:
9477 case ARM::BI__builtin_arm_mve_vmvnq_m_s16:
9478 case ARM::BI__builtin_arm_mve_vmvnq_m_s32:
9479 case ARM::BI__builtin_arm_mve_vmvnq_m_s8:
9480 case ARM::BI__builtin_arm_mve_vmvnq_m_u16:
9481 case ARM::BI__builtin_arm_mve_vmvnq_m_u32:
9482 case ARM::BI__builtin_arm_mve_vmvnq_m_u8:
9483 case ARM::BI__builtin_arm_mve_vnegq_m_f16:
9484 case ARM::BI__builtin_arm_mve_vnegq_m_f32:
9485 case ARM::BI__builtin_arm_mve_vnegq_m_s16:
9486 case ARM::BI__builtin_arm_mve_vnegq_m_s32:
9487 case ARM::BI__builtin_arm_mve_vnegq_m_s8:
9488 case ARM::BI__builtin_arm_mve_vqabsq_m_s16:
9489 case ARM::BI__builtin_arm_mve_vqabsq_m_s32:
9490 case ARM::BI__builtin_arm_mve_vqabsq_m_s8:
9491 case ARM::BI__builtin_arm_mve_vqnegq_m_s16:
9492 case ARM::BI__builtin_arm_mve_vqnegq_m_s32:
9493 case ARM::BI__builtin_arm_mve_vqnegq_m_s8:
9494 case ARM::BI__builtin_arm_mve_vrndaq_m_f16:
9495 case ARM::BI__builtin_arm_mve_vrndaq_m_f32:
9496 case ARM::BI__builtin_arm_mve_vrndmq_m_f16:
9497 case ARM::BI__builtin_arm_mve_vrndmq_m_f32:
9498 case ARM::BI__builtin_arm_mve_vrndnq_m_f16:
9499 case ARM::BI__builtin_arm_mve_vrndnq_m_f32:
9500 case ARM::BI__builtin_arm_mve_vrndpq_m_f16:
9501 case ARM::BI__builtin_arm_mve_vrndpq_m_f32:
9502 case ARM::BI__builtin_arm_mve_vrndq_m_f16:
9503 case ARM::BI__builtin_arm_mve_vrndq_m_f32:
9504 case ARM::BI__builtin_arm_mve_vrndxq_m_f16:
9505 case ARM::BI__builtin_arm_mve_vrndxq_m_f32: {
9506 llvm::Type * Param0;
9507 Intrinsic::ID Param1;
9508 llvm::Type * Param2;
9509 switch (BuiltinID) {
9510 case ARM::BI__builtin_arm_mve_vabsq_m_f16:
9511 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9512 Param1 = Intrinsic::arm_mve_abs_predicated;
9513 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9514 break;
9515 case ARM::BI__builtin_arm_mve_vabsq_m_f32:
9516 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9517 Param1 = Intrinsic::arm_mve_abs_predicated;
9518 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9519 break;
9520 case ARM::BI__builtin_arm_mve_vabsq_m_s16:
9521 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9522 Param1 = Intrinsic::arm_mve_abs_predicated;
9523 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9524 break;
9525 case ARM::BI__builtin_arm_mve_vabsq_m_s32:
9526 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9527 Param1 = Intrinsic::arm_mve_abs_predicated;
9528 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9529 break;
9530 case ARM::BI__builtin_arm_mve_vabsq_m_s8:
9531 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9532 Param1 = Intrinsic::arm_mve_abs_predicated;
9533 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9534 break;
9535 case ARM::BI__builtin_arm_mve_vclsq_m_s16:
9536 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9537 Param1 = Intrinsic::arm_mve_cls_predicated;
9538 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9539 break;
9540 case ARM::BI__builtin_arm_mve_vclsq_m_s32:
9541 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9542 Param1 = Intrinsic::arm_mve_cls_predicated;
9543 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9544 break;
9545 case ARM::BI__builtin_arm_mve_vclsq_m_s8:
9546 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9547 Param1 = Intrinsic::arm_mve_cls_predicated;
9548 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9549 break;
9550 case ARM::BI__builtin_arm_mve_vclzq_m_s16:
9551 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9552 Param1 = Intrinsic::arm_mve_clz_predicated;
9553 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9554 break;
9555 case ARM::BI__builtin_arm_mve_vclzq_m_s32:
9556 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9557 Param1 = Intrinsic::arm_mve_clz_predicated;
9558 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9559 break;
9560 case ARM::BI__builtin_arm_mve_vclzq_m_s8:
9561 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9562 Param1 = Intrinsic::arm_mve_clz_predicated;
9563 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9564 break;
9565 case ARM::BI__builtin_arm_mve_vclzq_m_u16:
9566 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9567 Param1 = Intrinsic::arm_mve_clz_predicated;
9568 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9569 break;
9570 case ARM::BI__builtin_arm_mve_vclzq_m_u32:
9571 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9572 Param1 = Intrinsic::arm_mve_clz_predicated;
9573 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9574 break;
9575 case ARM::BI__builtin_arm_mve_vclzq_m_u8:
9576 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9577 Param1 = Intrinsic::arm_mve_clz_predicated;
9578 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9579 break;
9580 case ARM::BI__builtin_arm_mve_vmvnq_m_s16:
9581 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9582 Param1 = Intrinsic::arm_mve_mvn_predicated;
9583 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9584 break;
9585 case ARM::BI__builtin_arm_mve_vmvnq_m_s32:
9586 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9587 Param1 = Intrinsic::arm_mve_mvn_predicated;
9588 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9589 break;
9590 case ARM::BI__builtin_arm_mve_vmvnq_m_s8:
9591 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9592 Param1 = Intrinsic::arm_mve_mvn_predicated;
9593 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9594 break;
9595 case ARM::BI__builtin_arm_mve_vmvnq_m_u16:
9596 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9597 Param1 = Intrinsic::arm_mve_mvn_predicated;
9598 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9599 break;
9600 case ARM::BI__builtin_arm_mve_vmvnq_m_u32:
9601 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9602 Param1 = Intrinsic::arm_mve_mvn_predicated;
9603 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9604 break;
9605 case ARM::BI__builtin_arm_mve_vmvnq_m_u8:
9606 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9607 Param1 = Intrinsic::arm_mve_mvn_predicated;
9608 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9609 break;
9610 case ARM::BI__builtin_arm_mve_vnegq_m_f16:
9611 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9612 Param1 = Intrinsic::arm_mve_neg_predicated;
9613 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9614 break;
9615 case ARM::BI__builtin_arm_mve_vnegq_m_f32:
9616 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9617 Param1 = Intrinsic::arm_mve_neg_predicated;
9618 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9619 break;
9620 case ARM::BI__builtin_arm_mve_vnegq_m_s16:
9621 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9622 Param1 = Intrinsic::arm_mve_neg_predicated;
9623 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9624 break;
9625 case ARM::BI__builtin_arm_mve_vnegq_m_s32:
9626 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9627 Param1 = Intrinsic::arm_mve_neg_predicated;
9628 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9629 break;
9630 case ARM::BI__builtin_arm_mve_vnegq_m_s8:
9631 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9632 Param1 = Intrinsic::arm_mve_neg_predicated;
9633 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9634 break;
9635 case ARM::BI__builtin_arm_mve_vqabsq_m_s16:
9636 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9637 Param1 = Intrinsic::arm_mve_qabs_predicated;
9638 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9639 break;
9640 case ARM::BI__builtin_arm_mve_vqabsq_m_s32:
9641 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9642 Param1 = Intrinsic::arm_mve_qabs_predicated;
9643 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9644 break;
9645 case ARM::BI__builtin_arm_mve_vqabsq_m_s8:
9646 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9647 Param1 = Intrinsic::arm_mve_qabs_predicated;
9648 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9649 break;
9650 case ARM::BI__builtin_arm_mve_vqnegq_m_s16:
9651 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9652 Param1 = Intrinsic::arm_mve_qneg_predicated;
9653 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9654 break;
9655 case ARM::BI__builtin_arm_mve_vqnegq_m_s32:
9656 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9657 Param1 = Intrinsic::arm_mve_qneg_predicated;
9658 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9659 break;
9660 case ARM::BI__builtin_arm_mve_vqnegq_m_s8:
9661 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9662 Param1 = Intrinsic::arm_mve_qneg_predicated;
9663 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9664 break;
9665 case ARM::BI__builtin_arm_mve_vrndaq_m_f16:
9666 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9667 Param1 = Intrinsic::arm_mve_vrinta_predicated;
9668 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9669 break;
9670 case ARM::BI__builtin_arm_mve_vrndaq_m_f32:
9671 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9672 Param1 = Intrinsic::arm_mve_vrinta_predicated;
9673 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9674 break;
9675 case ARM::BI__builtin_arm_mve_vrndmq_m_f16:
9676 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9677 Param1 = Intrinsic::arm_mve_vrintm_predicated;
9678 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9679 break;
9680 case ARM::BI__builtin_arm_mve_vrndmq_m_f32:
9681 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9682 Param1 = Intrinsic::arm_mve_vrintm_predicated;
9683 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9684 break;
9685 case ARM::BI__builtin_arm_mve_vrndnq_m_f16:
9686 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9687 Param1 = Intrinsic::arm_mve_vrintn_predicated;
9688 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9689 break;
9690 case ARM::BI__builtin_arm_mve_vrndnq_m_f32:
9691 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9692 Param1 = Intrinsic::arm_mve_vrintn_predicated;
9693 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9694 break;
9695 case ARM::BI__builtin_arm_mve_vrndpq_m_f16:
9696 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9697 Param1 = Intrinsic::arm_mve_vrintp_predicated;
9698 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9699 break;
9700 case ARM::BI__builtin_arm_mve_vrndpq_m_f32:
9701 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9702 Param1 = Intrinsic::arm_mve_vrintp_predicated;
9703 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9704 break;
9705 case ARM::BI__builtin_arm_mve_vrndq_m_f16:
9706 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9707 Param1 = Intrinsic::arm_mve_vrintz_predicated;
9708 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9709 break;
9710 case ARM::BI__builtin_arm_mve_vrndq_m_f32:
9711 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9712 Param1 = Intrinsic::arm_mve_vrintz_predicated;
9713 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9714 break;
9715 case ARM::BI__builtin_arm_mve_vrndxq_m_f16:
9716 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9717 Param1 = Intrinsic::arm_mve_vrintx_predicated;
9718 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9719 break;
9720 case ARM::BI__builtin_arm_mve_vrndxq_m_f32:
9721 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9722 Param1 = Intrinsic::arm_mve_vrintx_predicated;
9723 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9724 break;
9725 }
9726 Value *Val0 = EmitScalarExpr(E->getArg(1));
9727 Value *Val1 = EmitScalarExpr(E->getArg(2));
9728 Value *Val2 = Builder.CreateIntCast(Val1, Int32Ty, false);
9729 Value *Val3 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val2});
9730 Value *Val4 = EmitScalarExpr(E->getArg(0));
9731 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val3, Val4});
9732 }
9733 case ARM::BI__builtin_arm_mve_vaddq_m_f16:
9734 case ARM::BI__builtin_arm_mve_vaddq_m_f32:
9735 case ARM::BI__builtin_arm_mve_vaddq_m_s16:
9736 case ARM::BI__builtin_arm_mve_vaddq_m_s32:
9737 case ARM::BI__builtin_arm_mve_vaddq_m_s8:
9738 case ARM::BI__builtin_arm_mve_vaddq_m_u16:
9739 case ARM::BI__builtin_arm_mve_vaddq_m_u32:
9740 case ARM::BI__builtin_arm_mve_vaddq_m_u8:
9741 case ARM::BI__builtin_arm_mve_vmulq_m_f16:
9742 case ARM::BI__builtin_arm_mve_vmulq_m_f32:
9743 case ARM::BI__builtin_arm_mve_vmulq_m_s16:
9744 case ARM::BI__builtin_arm_mve_vmulq_m_s32:
9745 case ARM::BI__builtin_arm_mve_vmulq_m_s8:
9746 case ARM::BI__builtin_arm_mve_vmulq_m_u16:
9747 case ARM::BI__builtin_arm_mve_vmulq_m_u32:
9748 case ARM::BI__builtin_arm_mve_vmulq_m_u8:
9749 case ARM::BI__builtin_arm_mve_vqdmulhq_m_s16:
9750 case ARM::BI__builtin_arm_mve_vqdmulhq_m_s32:
9751 case ARM::BI__builtin_arm_mve_vqdmulhq_m_s8:
9752 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s16:
9753 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s32:
9754 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s8:
9755 case ARM::BI__builtin_arm_mve_vqshluq_m_n_s16:
9756 case ARM::BI__builtin_arm_mve_vqshluq_m_n_s32:
9757 case ARM::BI__builtin_arm_mve_vqshluq_m_n_s8:
9758 case ARM::BI__builtin_arm_mve_vshlq_m_n_s16:
9759 case ARM::BI__builtin_arm_mve_vshlq_m_n_s32:
9760 case ARM::BI__builtin_arm_mve_vshlq_m_n_s8:
9761 case ARM::BI__builtin_arm_mve_vshlq_m_n_u16:
9762 case ARM::BI__builtin_arm_mve_vshlq_m_n_u32:
9763 case ARM::BI__builtin_arm_mve_vshlq_m_n_u8:
9764 case ARM::BI__builtin_arm_mve_vsubq_m_f16:
9765 case ARM::BI__builtin_arm_mve_vsubq_m_f32:
9766 case ARM::BI__builtin_arm_mve_vsubq_m_s16:
9767 case ARM::BI__builtin_arm_mve_vsubq_m_s32:
9768 case ARM::BI__builtin_arm_mve_vsubq_m_s8:
9769 case ARM::BI__builtin_arm_mve_vsubq_m_u16:
9770 case ARM::BI__builtin_arm_mve_vsubq_m_u32:
9771 case ARM::BI__builtin_arm_mve_vsubq_m_u8: {
9772 llvm::Type * Param0;
9773 Intrinsic::ID Param1;
9774 llvm::Type * Param2;
9775 switch (BuiltinID) {
9776 case ARM::BI__builtin_arm_mve_vaddq_m_f16:
9777 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9778 Param1 = Intrinsic::arm_mve_add_predicated;
9779 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9780 break;
9781 case ARM::BI__builtin_arm_mve_vaddq_m_f32:
9782 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9783 Param1 = Intrinsic::arm_mve_add_predicated;
9784 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9785 break;
9786 case ARM::BI__builtin_arm_mve_vaddq_m_s16:
9787 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9788 Param1 = Intrinsic::arm_mve_add_predicated;
9789 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9790 break;
9791 case ARM::BI__builtin_arm_mve_vaddq_m_s32:
9792 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9793 Param1 = Intrinsic::arm_mve_add_predicated;
9794 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9795 break;
9796 case ARM::BI__builtin_arm_mve_vaddq_m_s8:
9797 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9798 Param1 = Intrinsic::arm_mve_add_predicated;
9799 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9800 break;
9801 case ARM::BI__builtin_arm_mve_vaddq_m_u16:
9802 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9803 Param1 = Intrinsic::arm_mve_add_predicated;
9804 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9805 break;
9806 case ARM::BI__builtin_arm_mve_vaddq_m_u32:
9807 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9808 Param1 = Intrinsic::arm_mve_add_predicated;
9809 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9810 break;
9811 case ARM::BI__builtin_arm_mve_vaddq_m_u8:
9812 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9813 Param1 = Intrinsic::arm_mve_add_predicated;
9814 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9815 break;
9816 case ARM::BI__builtin_arm_mve_vmulq_m_f16:
9817 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9818 Param1 = Intrinsic::arm_mve_mul_predicated;
9819 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9820 break;
9821 case ARM::BI__builtin_arm_mve_vmulq_m_f32:
9822 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9823 Param1 = Intrinsic::arm_mve_mul_predicated;
9824 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9825 break;
9826 case ARM::BI__builtin_arm_mve_vmulq_m_s16:
9827 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9828 Param1 = Intrinsic::arm_mve_mul_predicated;
9829 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9830 break;
9831 case ARM::BI__builtin_arm_mve_vmulq_m_s32:
9832 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9833 Param1 = Intrinsic::arm_mve_mul_predicated;
9834 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9835 break;
9836 case ARM::BI__builtin_arm_mve_vmulq_m_s8:
9837 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9838 Param1 = Intrinsic::arm_mve_mul_predicated;
9839 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9840 break;
9841 case ARM::BI__builtin_arm_mve_vmulq_m_u16:
9842 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9843 Param1 = Intrinsic::arm_mve_mul_predicated;
9844 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9845 break;
9846 case ARM::BI__builtin_arm_mve_vmulq_m_u32:
9847 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9848 Param1 = Intrinsic::arm_mve_mul_predicated;
9849 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9850 break;
9851 case ARM::BI__builtin_arm_mve_vmulq_m_u8:
9852 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9853 Param1 = Intrinsic::arm_mve_mul_predicated;
9854 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9855 break;
9856 case ARM::BI__builtin_arm_mve_vqdmulhq_m_s16:
9857 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9858 Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9859 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9860 break;
9861 case ARM::BI__builtin_arm_mve_vqdmulhq_m_s32:
9862 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9863 Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9864 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9865 break;
9866 case ARM::BI__builtin_arm_mve_vqdmulhq_m_s8:
9867 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9868 Param1 = Intrinsic::arm_mve_qdmulh_predicated;
9869 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9870 break;
9871 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s16:
9872 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9873 Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9874 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9875 break;
9876 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s32:
9877 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9878 Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9879 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9880 break;
9881 case ARM::BI__builtin_arm_mve_vqrdmulhq_m_s8:
9882 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9883 Param1 = Intrinsic::arm_mve_qrdmulh_predicated;
9884 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9885 break;
9886 case ARM::BI__builtin_arm_mve_vqshluq_m_n_s16:
9887 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9888 Param1 = Intrinsic::arm_mve_vqshlu_imm_predicated;
9889 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9890 break;
9891 case ARM::BI__builtin_arm_mve_vqshluq_m_n_s32:
9892 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9893 Param1 = Intrinsic::arm_mve_vqshlu_imm_predicated;
9894 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9895 break;
9896 case ARM::BI__builtin_arm_mve_vqshluq_m_n_s8:
9897 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9898 Param1 = Intrinsic::arm_mve_vqshlu_imm_predicated;
9899 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9900 break;
9901 case ARM::BI__builtin_arm_mve_vshlq_m_n_s16:
9902 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9903 Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9904 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9905 break;
9906 case ARM::BI__builtin_arm_mve_vshlq_m_n_s32:
9907 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9908 Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9909 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9910 break;
9911 case ARM::BI__builtin_arm_mve_vshlq_m_n_s8:
9912 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9913 Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9914 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9915 break;
9916 case ARM::BI__builtin_arm_mve_vshlq_m_n_u16:
9917 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9918 Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9919 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9920 break;
9921 case ARM::BI__builtin_arm_mve_vshlq_m_n_u32:
9922 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9923 Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9924 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9925 break;
9926 case ARM::BI__builtin_arm_mve_vshlq_m_n_u8:
9927 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9928 Param1 = Intrinsic::arm_mve_shl_imm_predicated;
9929 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9930 break;
9931 case ARM::BI__builtin_arm_mve_vsubq_m_f16:
9932 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9933 Param1 = Intrinsic::arm_mve_sub_predicated;
9934 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
9935 break;
9936 case ARM::BI__builtin_arm_mve_vsubq_m_f32:
9937 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9938 Param1 = Intrinsic::arm_mve_sub_predicated;
9939 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
9940 break;
9941 case ARM::BI__builtin_arm_mve_vsubq_m_s16:
9942 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9943 Param1 = Intrinsic::arm_mve_sub_predicated;
9944 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9945 break;
9946 case ARM::BI__builtin_arm_mve_vsubq_m_s32:
9947 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9948 Param1 = Intrinsic::arm_mve_sub_predicated;
9949 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9950 break;
9951 case ARM::BI__builtin_arm_mve_vsubq_m_s8:
9952 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9953 Param1 = Intrinsic::arm_mve_sub_predicated;
9954 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9955 break;
9956 case ARM::BI__builtin_arm_mve_vsubq_m_u16:
9957 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
9958 Param1 = Intrinsic::arm_mve_sub_predicated;
9959 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
9960 break;
9961 case ARM::BI__builtin_arm_mve_vsubq_m_u32:
9962 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
9963 Param1 = Intrinsic::arm_mve_sub_predicated;
9964 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
9965 break;
9966 case ARM::BI__builtin_arm_mve_vsubq_m_u8:
9967 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
9968 Param1 = Intrinsic::arm_mve_sub_predicated;
9969 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
9970 break;
9971 }
9972 Value *Val0 = EmitScalarExpr(E->getArg(1));
9973 Value *Val1 = EmitScalarExpr(E->getArg(2));
9974 Value *Val2 = EmitScalarExpr(E->getArg(3));
9975 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
9976 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val3});
9977 Value *Val5 = EmitScalarExpr(E->getArg(0));
9978 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param0}), {Val0, Val1, Val4, Val5});
9979 }
9980 case ARM::BI__builtin_arm_mve_vabdq_m_f16:
9981 case ARM::BI__builtin_arm_mve_vabdq_m_f32:
9982 case ARM::BI__builtin_arm_mve_vabdq_m_s16:
9983 case ARM::BI__builtin_arm_mve_vabdq_m_s32:
9984 case ARM::BI__builtin_arm_mve_vabdq_m_s8:
9985 case ARM::BI__builtin_arm_mve_vabdq_m_u16:
9986 case ARM::BI__builtin_arm_mve_vabdq_m_u32:
9987 case ARM::BI__builtin_arm_mve_vabdq_m_u8:
9988 case ARM::BI__builtin_arm_mve_vhaddq_m_s16:
9989 case ARM::BI__builtin_arm_mve_vhaddq_m_s32:
9990 case ARM::BI__builtin_arm_mve_vhaddq_m_s8:
9991 case ARM::BI__builtin_arm_mve_vhaddq_m_u16:
9992 case ARM::BI__builtin_arm_mve_vhaddq_m_u32:
9993 case ARM::BI__builtin_arm_mve_vhaddq_m_u8:
9994 case ARM::BI__builtin_arm_mve_vhsubq_m_s16:
9995 case ARM::BI__builtin_arm_mve_vhsubq_m_s32:
9996 case ARM::BI__builtin_arm_mve_vhsubq_m_s8:
9997 case ARM::BI__builtin_arm_mve_vhsubq_m_u16:
9998 case ARM::BI__builtin_arm_mve_vhsubq_m_u32:
9999 case ARM::BI__builtin_arm_mve_vhsubq_m_u8:
10000 case ARM::BI__builtin_arm_mve_vmaxnmq_m_f16:
10001 case ARM::BI__builtin_arm_mve_vmaxnmq_m_f32:
10002 case ARM::BI__builtin_arm_mve_vmaxq_m_s16:
10003 case ARM::BI__builtin_arm_mve_vmaxq_m_s32:
10004 case ARM::BI__builtin_arm_mve_vmaxq_m_s8:
10005 case ARM::BI__builtin_arm_mve_vmaxq_m_u16:
10006 case ARM::BI__builtin_arm_mve_vmaxq_m_u32:
10007 case ARM::BI__builtin_arm_mve_vmaxq_m_u8:
10008 case ARM::BI__builtin_arm_mve_vminnmq_m_f16:
10009 case ARM::BI__builtin_arm_mve_vminnmq_m_f32:
10010 case ARM::BI__builtin_arm_mve_vminq_m_s16:
10011 case ARM::BI__builtin_arm_mve_vminq_m_s32:
10012 case ARM::BI__builtin_arm_mve_vminq_m_s8:
10013 case ARM::BI__builtin_arm_mve_vminq_m_u16:
10014 case ARM::BI__builtin_arm_mve_vminq_m_u32:
10015 case ARM::BI__builtin_arm_mve_vminq_m_u8:
10016 case ARM::BI__builtin_arm_mve_vmulhq_m_s16:
10017 case ARM::BI__builtin_arm_mve_vmulhq_m_s32:
10018 case ARM::BI__builtin_arm_mve_vmulhq_m_s8:
10019 case ARM::BI__builtin_arm_mve_vmulhq_m_u16:
10020 case ARM::BI__builtin_arm_mve_vmulhq_m_u32:
10021 case ARM::BI__builtin_arm_mve_vmulhq_m_u8:
10022 case ARM::BI__builtin_arm_mve_vqaddq_m_s16:
10023 case ARM::BI__builtin_arm_mve_vqaddq_m_s32:
10024 case ARM::BI__builtin_arm_mve_vqaddq_m_s8:
10025 case ARM::BI__builtin_arm_mve_vqaddq_m_u16:
10026 case ARM::BI__builtin_arm_mve_vqaddq_m_u32:
10027 case ARM::BI__builtin_arm_mve_vqaddq_m_u8:
10028 case ARM::BI__builtin_arm_mve_vqshlq_m_n_s16:
10029 case ARM::BI__builtin_arm_mve_vqshlq_m_n_s32:
10030 case ARM::BI__builtin_arm_mve_vqshlq_m_n_s8:
10031 case ARM::BI__builtin_arm_mve_vqshlq_m_n_u16:
10032 case ARM::BI__builtin_arm_mve_vqshlq_m_n_u32:
10033 case ARM::BI__builtin_arm_mve_vqshlq_m_n_u8:
10034 case ARM::BI__builtin_arm_mve_vqsubq_m_s16:
10035 case ARM::BI__builtin_arm_mve_vqsubq_m_s32:
10036 case ARM::BI__builtin_arm_mve_vqsubq_m_s8:
10037 case ARM::BI__builtin_arm_mve_vqsubq_m_u16:
10038 case ARM::BI__builtin_arm_mve_vqsubq_m_u32:
10039 case ARM::BI__builtin_arm_mve_vqsubq_m_u8:
10040 case ARM::BI__builtin_arm_mve_vrhaddq_m_s16:
10041 case ARM::BI__builtin_arm_mve_vrhaddq_m_s32:
10042 case ARM::BI__builtin_arm_mve_vrhaddq_m_s8:
10043 case ARM::BI__builtin_arm_mve_vrhaddq_m_u16:
10044 case ARM::BI__builtin_arm_mve_vrhaddq_m_u32:
10045 case ARM::BI__builtin_arm_mve_vrhaddq_m_u8:
10046 case ARM::BI__builtin_arm_mve_vrmulhq_m_s16:
10047 case ARM::BI__builtin_arm_mve_vrmulhq_m_s32:
10048 case ARM::BI__builtin_arm_mve_vrmulhq_m_s8:
10049 case ARM::BI__builtin_arm_mve_vrmulhq_m_u16:
10050 case ARM::BI__builtin_arm_mve_vrmulhq_m_u32:
10051 case ARM::BI__builtin_arm_mve_vrmulhq_m_u8:
10052 case ARM::BI__builtin_arm_mve_vrshrq_m_n_s16:
10053 case ARM::BI__builtin_arm_mve_vrshrq_m_n_s32:
10054 case ARM::BI__builtin_arm_mve_vrshrq_m_n_s8:
10055 case ARM::BI__builtin_arm_mve_vrshrq_m_n_u16:
10056 case ARM::BI__builtin_arm_mve_vrshrq_m_n_u32:
10057 case ARM::BI__builtin_arm_mve_vrshrq_m_n_u8:
10058 case ARM::BI__builtin_arm_mve_vshrq_m_n_s16:
10059 case ARM::BI__builtin_arm_mve_vshrq_m_n_s32:
10060 case ARM::BI__builtin_arm_mve_vshrq_m_n_s8:
10061 case ARM::BI__builtin_arm_mve_vshrq_m_n_u16:
10062 case ARM::BI__builtin_arm_mve_vshrq_m_n_u32:
10063 case ARM::BI__builtin_arm_mve_vshrq_m_n_u8: {
10064 uint32_t Param0;
10065 llvm::Type * Param1;
10066 Intrinsic::ID Param2;
10067 llvm::Type * Param3;
10068 switch (BuiltinID) {
10069 case ARM::BI__builtin_arm_mve_vabdq_m_f16:
10070 Param0 = 0;
10071 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10072 Param2 = Intrinsic::arm_mve_abd_predicated;
10073 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
10074 break;
10075 case ARM::BI__builtin_arm_mve_vabdq_m_f32:
10076 Param0 = 0;
10077 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10078 Param2 = Intrinsic::arm_mve_abd_predicated;
10079 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
10080 break;
10081 case ARM::BI__builtin_arm_mve_vabdq_m_s16:
10082 Param0 = 0;
10083 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10084 Param2 = Intrinsic::arm_mve_abd_predicated;
10085 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10086 break;
10087 case ARM::BI__builtin_arm_mve_vabdq_m_s32:
10088 Param0 = 0;
10089 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10090 Param2 = Intrinsic::arm_mve_abd_predicated;
10091 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10092 break;
10093 case ARM::BI__builtin_arm_mve_vabdq_m_s8:
10094 Param0 = 0;
10095 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10096 Param2 = Intrinsic::arm_mve_abd_predicated;
10097 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10098 break;
10099 case ARM::BI__builtin_arm_mve_vabdq_m_u16:
10100 Param0 = 1;
10101 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10102 Param2 = Intrinsic::arm_mve_abd_predicated;
10103 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10104 break;
10105 case ARM::BI__builtin_arm_mve_vabdq_m_u32:
10106 Param0 = 1;
10107 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10108 Param2 = Intrinsic::arm_mve_abd_predicated;
10109 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10110 break;
10111 case ARM::BI__builtin_arm_mve_vabdq_m_u8:
10112 Param0 = 1;
10113 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10114 Param2 = Intrinsic::arm_mve_abd_predicated;
10115 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10116 break;
10117 case ARM::BI__builtin_arm_mve_vhaddq_m_s16:
10118 Param0 = 0;
10119 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10120 Param2 = Intrinsic::arm_mve_hadd_predicated;
10121 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10122 break;
10123 case ARM::BI__builtin_arm_mve_vhaddq_m_s32:
10124 Param0 = 0;
10125 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10126 Param2 = Intrinsic::arm_mve_hadd_predicated;
10127 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10128 break;
10129 case ARM::BI__builtin_arm_mve_vhaddq_m_s8:
10130 Param0 = 0;
10131 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10132 Param2 = Intrinsic::arm_mve_hadd_predicated;
10133 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10134 break;
10135 case ARM::BI__builtin_arm_mve_vhaddq_m_u16:
10136 Param0 = 1;
10137 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10138 Param2 = Intrinsic::arm_mve_hadd_predicated;
10139 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10140 break;
10141 case ARM::BI__builtin_arm_mve_vhaddq_m_u32:
10142 Param0 = 1;
10143 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10144 Param2 = Intrinsic::arm_mve_hadd_predicated;
10145 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10146 break;
10147 case ARM::BI__builtin_arm_mve_vhaddq_m_u8:
10148 Param0 = 1;
10149 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10150 Param2 = Intrinsic::arm_mve_hadd_predicated;
10151 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10152 break;
10153 case ARM::BI__builtin_arm_mve_vhsubq_m_s16:
10154 Param0 = 0;
10155 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10156 Param2 = Intrinsic::arm_mve_hsub_predicated;
10157 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10158 break;
10159 case ARM::BI__builtin_arm_mve_vhsubq_m_s32:
10160 Param0 = 0;
10161 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10162 Param2 = Intrinsic::arm_mve_hsub_predicated;
10163 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10164 break;
10165 case ARM::BI__builtin_arm_mve_vhsubq_m_s8:
10166 Param0 = 0;
10167 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10168 Param2 = Intrinsic::arm_mve_hsub_predicated;
10169 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10170 break;
10171 case ARM::BI__builtin_arm_mve_vhsubq_m_u16:
10172 Param0 = 1;
10173 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10174 Param2 = Intrinsic::arm_mve_hsub_predicated;
10175 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10176 break;
10177 case ARM::BI__builtin_arm_mve_vhsubq_m_u32:
10178 Param0 = 1;
10179 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10180 Param2 = Intrinsic::arm_mve_hsub_predicated;
10181 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10182 break;
10183 case ARM::BI__builtin_arm_mve_vhsubq_m_u8:
10184 Param0 = 1;
10185 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10186 Param2 = Intrinsic::arm_mve_hsub_predicated;
10187 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10188 break;
10189 case ARM::BI__builtin_arm_mve_vmaxnmq_m_f16:
10190 Param0 = 0;
10191 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10192 Param2 = Intrinsic::arm_mve_max_predicated;
10193 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
10194 break;
10195 case ARM::BI__builtin_arm_mve_vmaxnmq_m_f32:
10196 Param0 = 0;
10197 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10198 Param2 = Intrinsic::arm_mve_max_predicated;
10199 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
10200 break;
10201 case ARM::BI__builtin_arm_mve_vmaxq_m_s16:
10202 Param0 = 0;
10203 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10204 Param2 = Intrinsic::arm_mve_max_predicated;
10205 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10206 break;
10207 case ARM::BI__builtin_arm_mve_vmaxq_m_s32:
10208 Param0 = 0;
10209 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10210 Param2 = Intrinsic::arm_mve_max_predicated;
10211 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10212 break;
10213 case ARM::BI__builtin_arm_mve_vmaxq_m_s8:
10214 Param0 = 0;
10215 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10216 Param2 = Intrinsic::arm_mve_max_predicated;
10217 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10218 break;
10219 case ARM::BI__builtin_arm_mve_vmaxq_m_u16:
10220 Param0 = 1;
10221 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10222 Param2 = Intrinsic::arm_mve_max_predicated;
10223 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10224 break;
10225 case ARM::BI__builtin_arm_mve_vmaxq_m_u32:
10226 Param0 = 1;
10227 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10228 Param2 = Intrinsic::arm_mve_max_predicated;
10229 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10230 break;
10231 case ARM::BI__builtin_arm_mve_vmaxq_m_u8:
10232 Param0 = 1;
10233 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10234 Param2 = Intrinsic::arm_mve_max_predicated;
10235 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10236 break;
10237 case ARM::BI__builtin_arm_mve_vminnmq_m_f16:
10238 Param0 = 0;
10239 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10240 Param2 = Intrinsic::arm_mve_min_predicated;
10241 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
10242 break;
10243 case ARM::BI__builtin_arm_mve_vminnmq_m_f32:
10244 Param0 = 0;
10245 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10246 Param2 = Intrinsic::arm_mve_min_predicated;
10247 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
10248 break;
10249 case ARM::BI__builtin_arm_mve_vminq_m_s16:
10250 Param0 = 0;
10251 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10252 Param2 = Intrinsic::arm_mve_min_predicated;
10253 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10254 break;
10255 case ARM::BI__builtin_arm_mve_vminq_m_s32:
10256 Param0 = 0;
10257 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10258 Param2 = Intrinsic::arm_mve_min_predicated;
10259 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10260 break;
10261 case ARM::BI__builtin_arm_mve_vminq_m_s8:
10262 Param0 = 0;
10263 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10264 Param2 = Intrinsic::arm_mve_min_predicated;
10265 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10266 break;
10267 case ARM::BI__builtin_arm_mve_vminq_m_u16:
10268 Param0 = 1;
10269 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10270 Param2 = Intrinsic::arm_mve_min_predicated;
10271 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10272 break;
10273 case ARM::BI__builtin_arm_mve_vminq_m_u32:
10274 Param0 = 1;
10275 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10276 Param2 = Intrinsic::arm_mve_min_predicated;
10277 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10278 break;
10279 case ARM::BI__builtin_arm_mve_vminq_m_u8:
10280 Param0 = 1;
10281 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10282 Param2 = Intrinsic::arm_mve_min_predicated;
10283 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10284 break;
10285 case ARM::BI__builtin_arm_mve_vmulhq_m_s16:
10286 Param0 = 0;
10287 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10288 Param2 = Intrinsic::arm_mve_mulh_predicated;
10289 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10290 break;
10291 case ARM::BI__builtin_arm_mve_vmulhq_m_s32:
10292 Param0 = 0;
10293 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10294 Param2 = Intrinsic::arm_mve_mulh_predicated;
10295 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10296 break;
10297 case ARM::BI__builtin_arm_mve_vmulhq_m_s8:
10298 Param0 = 0;
10299 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10300 Param2 = Intrinsic::arm_mve_mulh_predicated;
10301 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10302 break;
10303 case ARM::BI__builtin_arm_mve_vmulhq_m_u16:
10304 Param0 = 1;
10305 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10306 Param2 = Intrinsic::arm_mve_mulh_predicated;
10307 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10308 break;
10309 case ARM::BI__builtin_arm_mve_vmulhq_m_u32:
10310 Param0 = 1;
10311 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10312 Param2 = Intrinsic::arm_mve_mulh_predicated;
10313 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10314 break;
10315 case ARM::BI__builtin_arm_mve_vmulhq_m_u8:
10316 Param0 = 1;
10317 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10318 Param2 = Intrinsic::arm_mve_mulh_predicated;
10319 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10320 break;
10321 case ARM::BI__builtin_arm_mve_vqaddq_m_s16:
10322 Param0 = 0;
10323 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10324 Param2 = Intrinsic::arm_mve_qadd_predicated;
10325 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10326 break;
10327 case ARM::BI__builtin_arm_mve_vqaddq_m_s32:
10328 Param0 = 0;
10329 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10330 Param2 = Intrinsic::arm_mve_qadd_predicated;
10331 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10332 break;
10333 case ARM::BI__builtin_arm_mve_vqaddq_m_s8:
10334 Param0 = 0;
10335 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10336 Param2 = Intrinsic::arm_mve_qadd_predicated;
10337 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10338 break;
10339 case ARM::BI__builtin_arm_mve_vqaddq_m_u16:
10340 Param0 = 1;
10341 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10342 Param2 = Intrinsic::arm_mve_qadd_predicated;
10343 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10344 break;
10345 case ARM::BI__builtin_arm_mve_vqaddq_m_u32:
10346 Param0 = 1;
10347 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10348 Param2 = Intrinsic::arm_mve_qadd_predicated;
10349 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10350 break;
10351 case ARM::BI__builtin_arm_mve_vqaddq_m_u8:
10352 Param0 = 1;
10353 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10354 Param2 = Intrinsic::arm_mve_qadd_predicated;
10355 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10356 break;
10357 case ARM::BI__builtin_arm_mve_vqshlq_m_n_s16:
10358 Param0 = 0;
10359 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10360 Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10361 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10362 break;
10363 case ARM::BI__builtin_arm_mve_vqshlq_m_n_s32:
10364 Param0 = 0;
10365 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10366 Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10367 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10368 break;
10369 case ARM::BI__builtin_arm_mve_vqshlq_m_n_s8:
10370 Param0 = 0;
10371 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10372 Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10373 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10374 break;
10375 case ARM::BI__builtin_arm_mve_vqshlq_m_n_u16:
10376 Param0 = 1;
10377 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10378 Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10379 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10380 break;
10381 case ARM::BI__builtin_arm_mve_vqshlq_m_n_u32:
10382 Param0 = 1;
10383 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10384 Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10385 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10386 break;
10387 case ARM::BI__builtin_arm_mve_vqshlq_m_n_u8:
10388 Param0 = 1;
10389 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10390 Param2 = Intrinsic::arm_mve_vqshl_imm_predicated;
10391 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10392 break;
10393 case ARM::BI__builtin_arm_mve_vqsubq_m_s16:
10394 Param0 = 0;
10395 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10396 Param2 = Intrinsic::arm_mve_qsub_predicated;
10397 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10398 break;
10399 case ARM::BI__builtin_arm_mve_vqsubq_m_s32:
10400 Param0 = 0;
10401 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10402 Param2 = Intrinsic::arm_mve_qsub_predicated;
10403 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10404 break;
10405 case ARM::BI__builtin_arm_mve_vqsubq_m_s8:
10406 Param0 = 0;
10407 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10408 Param2 = Intrinsic::arm_mve_qsub_predicated;
10409 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10410 break;
10411 case ARM::BI__builtin_arm_mve_vqsubq_m_u16:
10412 Param0 = 1;
10413 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10414 Param2 = Intrinsic::arm_mve_qsub_predicated;
10415 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10416 break;
10417 case ARM::BI__builtin_arm_mve_vqsubq_m_u32:
10418 Param0 = 1;
10419 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10420 Param2 = Intrinsic::arm_mve_qsub_predicated;
10421 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10422 break;
10423 case ARM::BI__builtin_arm_mve_vqsubq_m_u8:
10424 Param0 = 1;
10425 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10426 Param2 = Intrinsic::arm_mve_qsub_predicated;
10427 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10428 break;
10429 case ARM::BI__builtin_arm_mve_vrhaddq_m_s16:
10430 Param0 = 0;
10431 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10432 Param2 = Intrinsic::arm_mve_rhadd_predicated;
10433 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10434 break;
10435 case ARM::BI__builtin_arm_mve_vrhaddq_m_s32:
10436 Param0 = 0;
10437 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10438 Param2 = Intrinsic::arm_mve_rhadd_predicated;
10439 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10440 break;
10441 case ARM::BI__builtin_arm_mve_vrhaddq_m_s8:
10442 Param0 = 0;
10443 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10444 Param2 = Intrinsic::arm_mve_rhadd_predicated;
10445 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10446 break;
10447 case ARM::BI__builtin_arm_mve_vrhaddq_m_u16:
10448 Param0 = 1;
10449 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10450 Param2 = Intrinsic::arm_mve_rhadd_predicated;
10451 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10452 break;
10453 case ARM::BI__builtin_arm_mve_vrhaddq_m_u32:
10454 Param0 = 1;
10455 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10456 Param2 = Intrinsic::arm_mve_rhadd_predicated;
10457 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10458 break;
10459 case ARM::BI__builtin_arm_mve_vrhaddq_m_u8:
10460 Param0 = 1;
10461 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10462 Param2 = Intrinsic::arm_mve_rhadd_predicated;
10463 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10464 break;
10465 case ARM::BI__builtin_arm_mve_vrmulhq_m_s16:
10466 Param0 = 0;
10467 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10468 Param2 = Intrinsic::arm_mve_rmulh_predicated;
10469 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10470 break;
10471 case ARM::BI__builtin_arm_mve_vrmulhq_m_s32:
10472 Param0 = 0;
10473 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10474 Param2 = Intrinsic::arm_mve_rmulh_predicated;
10475 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10476 break;
10477 case ARM::BI__builtin_arm_mve_vrmulhq_m_s8:
10478 Param0 = 0;
10479 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10480 Param2 = Intrinsic::arm_mve_rmulh_predicated;
10481 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10482 break;
10483 case ARM::BI__builtin_arm_mve_vrmulhq_m_u16:
10484 Param0 = 1;
10485 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10486 Param2 = Intrinsic::arm_mve_rmulh_predicated;
10487 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10488 break;
10489 case ARM::BI__builtin_arm_mve_vrmulhq_m_u32:
10490 Param0 = 1;
10491 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10492 Param2 = Intrinsic::arm_mve_rmulh_predicated;
10493 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10494 break;
10495 case ARM::BI__builtin_arm_mve_vrmulhq_m_u8:
10496 Param0 = 1;
10497 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10498 Param2 = Intrinsic::arm_mve_rmulh_predicated;
10499 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10500 break;
10501 case ARM::BI__builtin_arm_mve_vrshrq_m_n_s16:
10502 Param0 = 0;
10503 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10504 Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10505 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10506 break;
10507 case ARM::BI__builtin_arm_mve_vrshrq_m_n_s32:
10508 Param0 = 0;
10509 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10510 Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10511 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10512 break;
10513 case ARM::BI__builtin_arm_mve_vrshrq_m_n_s8:
10514 Param0 = 0;
10515 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10516 Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10517 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10518 break;
10519 case ARM::BI__builtin_arm_mve_vrshrq_m_n_u16:
10520 Param0 = 1;
10521 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10522 Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10523 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10524 break;
10525 case ARM::BI__builtin_arm_mve_vrshrq_m_n_u32:
10526 Param0 = 1;
10527 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10528 Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10529 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10530 break;
10531 case ARM::BI__builtin_arm_mve_vrshrq_m_n_u8:
10532 Param0 = 1;
10533 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10534 Param2 = Intrinsic::arm_mve_vrshr_imm_predicated;
10535 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10536 break;
10537 case ARM::BI__builtin_arm_mve_vshrq_m_n_s16:
10538 Param0 = 0;
10539 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10540 Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10541 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10542 break;
10543 case ARM::BI__builtin_arm_mve_vshrq_m_n_s32:
10544 Param0 = 0;
10545 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10546 Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10547 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10548 break;
10549 case ARM::BI__builtin_arm_mve_vshrq_m_n_s8:
10550 Param0 = 0;
10551 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10552 Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10553 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10554 break;
10555 case ARM::BI__builtin_arm_mve_vshrq_m_n_u16:
10556 Param0 = 1;
10557 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10558 Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10559 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10560 break;
10561 case ARM::BI__builtin_arm_mve_vshrq_m_n_u32:
10562 Param0 = 1;
10563 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10564 Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10565 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10566 break;
10567 case ARM::BI__builtin_arm_mve_vshrq_m_n_u8:
10568 Param0 = 1;
10569 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10570 Param2 = Intrinsic::arm_mve_shr_imm_predicated;
10571 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
10572 break;
10573 }
10574 Value *Val0 = EmitScalarExpr(E->getArg(1));
10575 Value *Val1 = EmitScalarExpr(E->getArg(2));
10576 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
10577 Value *Val3 = EmitScalarExpr(E->getArg(3));
10578 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
10579 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
10580 Value *Val6 = EmitScalarExpr(E->getArg(0));
10581 return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val2, Val5, Val6});
10582 }
10583 case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p16:
10584 case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p8:
10585 case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p16:
10586 case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p8:
10587 case ARM::BI__builtin_arm_mve_vqdmullbq_m_s16:
10588 case ARM::BI__builtin_arm_mve_vqdmullbq_m_s32:
10589 case ARM::BI__builtin_arm_mve_vqdmulltq_m_s16:
10590 case ARM::BI__builtin_arm_mve_vqdmulltq_m_s32: {
10591 uint32_t Param0;
10592 llvm::Type * Param1;
10593 Intrinsic::ID Param2;
10594 llvm::Type * Param3;
10595 llvm::Type * Param4;
10596 switch (BuiltinID) {
10597 case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p16:
10598 Param0 = 0;
10599 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10600 Param2 = Intrinsic::arm_mve_mull_poly_predicated;
10601 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10602 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10603 break;
10604 case ARM::BI__builtin_arm_mve_vmullbq_poly_m_p8:
10605 Param0 = 0;
10606 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10607 Param2 = Intrinsic::arm_mve_mull_poly_predicated;
10608 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10609 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10610 break;
10611 case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p16:
10612 Param0 = 1;
10613 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10614 Param2 = Intrinsic::arm_mve_mull_poly_predicated;
10615 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10616 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10617 break;
10618 case ARM::BI__builtin_arm_mve_vmulltq_poly_m_p8:
10619 Param0 = 1;
10620 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10621 Param2 = Intrinsic::arm_mve_mull_poly_predicated;
10622 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
10623 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10624 break;
10625 case ARM::BI__builtin_arm_mve_vqdmullbq_m_s16:
10626 Param0 = 0;
10627 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10628 Param2 = Intrinsic::arm_mve_vqdmull_predicated;
10629 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10630 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10631 break;
10632 case ARM::BI__builtin_arm_mve_vqdmullbq_m_s32:
10633 Param0 = 0;
10634 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10635 Param2 = Intrinsic::arm_mve_vqdmull_predicated;
10636 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
10637 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10638 break;
10639 case ARM::BI__builtin_arm_mve_vqdmulltq_m_s16:
10640 Param0 = 1;
10641 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10642 Param2 = Intrinsic::arm_mve_vqdmull_predicated;
10643 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
10644 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10645 break;
10646 case ARM::BI__builtin_arm_mve_vqdmulltq_m_s32:
10647 Param0 = 1;
10648 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10649 Param2 = Intrinsic::arm_mve_vqdmull_predicated;
10650 Param3 = llvm::FixedVectorType::get(Int64Ty, 2);
10651 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10652 break;
10653 }
10654 Value *Val0 = EmitScalarExpr(E->getArg(1));
10655 Value *Val1 = EmitScalarExpr(E->getArg(2));
10656 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
10657 Value *Val3 = EmitScalarExpr(E->getArg(3));
10658 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
10659 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
10660 Value *Val6 = EmitScalarExpr(E->getArg(0));
10661 return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param4, Param1}), {Val0, Val1, Val2, Val5, Val6});
10662 }
10663 case ARM::BI__builtin_arm_mve_vmullbq_int_m_s16:
10664 case ARM::BI__builtin_arm_mve_vmullbq_int_m_s32:
10665 case ARM::BI__builtin_arm_mve_vmullbq_int_m_s8:
10666 case ARM::BI__builtin_arm_mve_vmullbq_int_m_u16:
10667 case ARM::BI__builtin_arm_mve_vmullbq_int_m_u32:
10668 case ARM::BI__builtin_arm_mve_vmullbq_int_m_u8:
10669 case ARM::BI__builtin_arm_mve_vmulltq_int_m_s16:
10670 case ARM::BI__builtin_arm_mve_vmulltq_int_m_s32:
10671 case ARM::BI__builtin_arm_mve_vmulltq_int_m_s8:
10672 case ARM::BI__builtin_arm_mve_vmulltq_int_m_u16:
10673 case ARM::BI__builtin_arm_mve_vmulltq_int_m_u32:
10674 case ARM::BI__builtin_arm_mve_vmulltq_int_m_u8:
10675 case ARM::BI__builtin_arm_mve_vshllbq_m_n_s16:
10676 case ARM::BI__builtin_arm_mve_vshllbq_m_n_s8:
10677 case ARM::BI__builtin_arm_mve_vshllbq_m_n_u16:
10678 case ARM::BI__builtin_arm_mve_vshllbq_m_n_u8:
10679 case ARM::BI__builtin_arm_mve_vshlltq_m_n_s16:
10680 case ARM::BI__builtin_arm_mve_vshlltq_m_n_s8:
10681 case ARM::BI__builtin_arm_mve_vshlltq_m_n_u16:
10682 case ARM::BI__builtin_arm_mve_vshlltq_m_n_u8: {
10683 uint32_t Param0;
10684 uint32_t Param1;
10685 llvm::Type * Param2;
10686 Intrinsic::ID Param3;
10687 llvm::Type * Param4;
10688 llvm::Type * Param5;
10689 switch (BuiltinID) {
10690 case ARM::BI__builtin_arm_mve_vmullbq_int_m_s16:
10691 Param0 = 0;
10692 Param1 = 0;
10693 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10694 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10695 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10696 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10697 break;
10698 case ARM::BI__builtin_arm_mve_vmullbq_int_m_s32:
10699 Param0 = 0;
10700 Param1 = 0;
10701 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10702 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10703 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
10704 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
10705 break;
10706 case ARM::BI__builtin_arm_mve_vmullbq_int_m_s8:
10707 Param0 = 0;
10708 Param1 = 0;
10709 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10710 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10711 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10712 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10713 break;
10714 case ARM::BI__builtin_arm_mve_vmullbq_int_m_u16:
10715 Param0 = 1;
10716 Param1 = 0;
10717 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10718 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10719 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10720 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10721 break;
10722 case ARM::BI__builtin_arm_mve_vmullbq_int_m_u32:
10723 Param0 = 1;
10724 Param1 = 0;
10725 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10726 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10727 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
10728 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
10729 break;
10730 case ARM::BI__builtin_arm_mve_vmullbq_int_m_u8:
10731 Param0 = 1;
10732 Param1 = 0;
10733 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10734 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10735 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10736 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10737 break;
10738 case ARM::BI__builtin_arm_mve_vmulltq_int_m_s16:
10739 Param0 = 0;
10740 Param1 = 1;
10741 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10742 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10743 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10744 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10745 break;
10746 case ARM::BI__builtin_arm_mve_vmulltq_int_m_s32:
10747 Param0 = 0;
10748 Param1 = 1;
10749 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10750 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10751 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
10752 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
10753 break;
10754 case ARM::BI__builtin_arm_mve_vmulltq_int_m_s8:
10755 Param0 = 0;
10756 Param1 = 1;
10757 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10758 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10759 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10760 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10761 break;
10762 case ARM::BI__builtin_arm_mve_vmulltq_int_m_u16:
10763 Param0 = 1;
10764 Param1 = 1;
10765 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10766 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10767 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10768 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10769 break;
10770 case ARM::BI__builtin_arm_mve_vmulltq_int_m_u32:
10771 Param0 = 1;
10772 Param1 = 1;
10773 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 2);
10774 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10775 Param4 = llvm::FixedVectorType::get(Int64Ty, 2);
10776 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
10777 break;
10778 case ARM::BI__builtin_arm_mve_vmulltq_int_m_u8:
10779 Param0 = 1;
10780 Param1 = 1;
10781 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10782 Param3 = Intrinsic::arm_mve_mull_int_predicated;
10783 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10784 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10785 break;
10786 case ARM::BI__builtin_arm_mve_vshllbq_m_n_s16:
10787 Param0 = 0;
10788 Param1 = 0;
10789 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10790 Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10791 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10792 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10793 break;
10794 case ARM::BI__builtin_arm_mve_vshllbq_m_n_s8:
10795 Param0 = 0;
10796 Param1 = 0;
10797 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10798 Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10799 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10800 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10801 break;
10802 case ARM::BI__builtin_arm_mve_vshllbq_m_n_u16:
10803 Param0 = 1;
10804 Param1 = 0;
10805 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10806 Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10807 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10808 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10809 break;
10810 case ARM::BI__builtin_arm_mve_vshllbq_m_n_u8:
10811 Param0 = 1;
10812 Param1 = 0;
10813 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10814 Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10815 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10816 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10817 break;
10818 case ARM::BI__builtin_arm_mve_vshlltq_m_n_s16:
10819 Param0 = 0;
10820 Param1 = 1;
10821 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10822 Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10823 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10824 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10825 break;
10826 case ARM::BI__builtin_arm_mve_vshlltq_m_n_s8:
10827 Param0 = 0;
10828 Param1 = 1;
10829 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10830 Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10831 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10832 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10833 break;
10834 case ARM::BI__builtin_arm_mve_vshlltq_m_n_u16:
10835 Param0 = 1;
10836 Param1 = 1;
10837 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10838 Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10839 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10840 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
10841 break;
10842 case ARM::BI__builtin_arm_mve_vshlltq_m_n_u8:
10843 Param0 = 1;
10844 Param1 = 1;
10845 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10846 Param3 = Intrinsic::arm_mve_vshll_imm_predicated;
10847 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10848 Param5 = llvm::FixedVectorType::get(Int8Ty, 16);
10849 break;
10850 }
10851 Value *Val0 = EmitScalarExpr(E->getArg(1));
10852 Value *Val1 = EmitScalarExpr(E->getArg(2));
10853 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
10854 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
10855 Value *Val4 = EmitScalarExpr(E->getArg(3));
10856 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
10857 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val5});
10858 Value *Val7 = EmitScalarExpr(E->getArg(0));
10859 return Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4, Param5, Param2}), {Val0, Val1, Val2, Val3, Val6, Val7});
10860 }
10861 case ARM::BI__builtin_arm_mve_vqrshlq_m_s16:
10862 case ARM::BI__builtin_arm_mve_vqrshlq_m_s32:
10863 case ARM::BI__builtin_arm_mve_vqrshlq_m_s8:
10864 case ARM::BI__builtin_arm_mve_vqrshlq_m_u16:
10865 case ARM::BI__builtin_arm_mve_vqrshlq_m_u32:
10866 case ARM::BI__builtin_arm_mve_vqrshlq_m_u8:
10867 case ARM::BI__builtin_arm_mve_vqshlq_m_s16:
10868 case ARM::BI__builtin_arm_mve_vqshlq_m_s32:
10869 case ARM::BI__builtin_arm_mve_vqshlq_m_s8:
10870 case ARM::BI__builtin_arm_mve_vqshlq_m_u16:
10871 case ARM::BI__builtin_arm_mve_vqshlq_m_u32:
10872 case ARM::BI__builtin_arm_mve_vqshlq_m_u8:
10873 case ARM::BI__builtin_arm_mve_vrshlq_m_s16:
10874 case ARM::BI__builtin_arm_mve_vrshlq_m_s32:
10875 case ARM::BI__builtin_arm_mve_vrshlq_m_s8:
10876 case ARM::BI__builtin_arm_mve_vrshlq_m_u16:
10877 case ARM::BI__builtin_arm_mve_vrshlq_m_u32:
10878 case ARM::BI__builtin_arm_mve_vrshlq_m_u8:
10879 case ARM::BI__builtin_arm_mve_vshlq_m_s16:
10880 case ARM::BI__builtin_arm_mve_vshlq_m_s32:
10881 case ARM::BI__builtin_arm_mve_vshlq_m_s8:
10882 case ARM::BI__builtin_arm_mve_vshlq_m_u16:
10883 case ARM::BI__builtin_arm_mve_vshlq_m_u32:
10884 case ARM::BI__builtin_arm_mve_vshlq_m_u8: {
10885 uint32_t Param0;
10886 uint32_t Param1;
10887 uint32_t Param2;
10888 llvm::Type * Param3;
10889 llvm::Type * Param4;
10890 switch (BuiltinID) {
10891 case ARM::BI__builtin_arm_mve_vqrshlq_m_s16:
10892 Param0 = 1;
10893 Param1 = 1;
10894 Param2 = 0;
10895 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10896 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10897 break;
10898 case ARM::BI__builtin_arm_mve_vqrshlq_m_s32:
10899 Param0 = 1;
10900 Param1 = 1;
10901 Param2 = 0;
10902 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10903 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10904 break;
10905 case ARM::BI__builtin_arm_mve_vqrshlq_m_s8:
10906 Param0 = 1;
10907 Param1 = 1;
10908 Param2 = 0;
10909 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10910 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10911 break;
10912 case ARM::BI__builtin_arm_mve_vqrshlq_m_u16:
10913 Param0 = 1;
10914 Param1 = 1;
10915 Param2 = 1;
10916 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10917 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10918 break;
10919 case ARM::BI__builtin_arm_mve_vqrshlq_m_u32:
10920 Param0 = 1;
10921 Param1 = 1;
10922 Param2 = 1;
10923 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10924 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10925 break;
10926 case ARM::BI__builtin_arm_mve_vqrshlq_m_u8:
10927 Param0 = 1;
10928 Param1 = 1;
10929 Param2 = 1;
10930 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10931 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10932 break;
10933 case ARM::BI__builtin_arm_mve_vqshlq_m_s16:
10934 Param0 = 1;
10935 Param1 = 0;
10936 Param2 = 0;
10937 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10938 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10939 break;
10940 case ARM::BI__builtin_arm_mve_vqshlq_m_s32:
10941 Param0 = 1;
10942 Param1 = 0;
10943 Param2 = 0;
10944 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10945 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10946 break;
10947 case ARM::BI__builtin_arm_mve_vqshlq_m_s8:
10948 Param0 = 1;
10949 Param1 = 0;
10950 Param2 = 0;
10951 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10952 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10953 break;
10954 case ARM::BI__builtin_arm_mve_vqshlq_m_u16:
10955 Param0 = 1;
10956 Param1 = 0;
10957 Param2 = 1;
10958 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10959 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10960 break;
10961 case ARM::BI__builtin_arm_mve_vqshlq_m_u32:
10962 Param0 = 1;
10963 Param1 = 0;
10964 Param2 = 1;
10965 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10966 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10967 break;
10968 case ARM::BI__builtin_arm_mve_vqshlq_m_u8:
10969 Param0 = 1;
10970 Param1 = 0;
10971 Param2 = 1;
10972 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10973 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10974 break;
10975 case ARM::BI__builtin_arm_mve_vrshlq_m_s16:
10976 Param0 = 0;
10977 Param1 = 1;
10978 Param2 = 0;
10979 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
10980 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
10981 break;
10982 case ARM::BI__builtin_arm_mve_vrshlq_m_s32:
10983 Param0 = 0;
10984 Param1 = 1;
10985 Param2 = 0;
10986 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
10987 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
10988 break;
10989 case ARM::BI__builtin_arm_mve_vrshlq_m_s8:
10990 Param0 = 0;
10991 Param1 = 1;
10992 Param2 = 0;
10993 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
10994 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
10995 break;
10996 case ARM::BI__builtin_arm_mve_vrshlq_m_u16:
10997 Param0 = 0;
10998 Param1 = 1;
10999 Param2 = 1;
11000 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11001 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11002 break;
11003 case ARM::BI__builtin_arm_mve_vrshlq_m_u32:
11004 Param0 = 0;
11005 Param1 = 1;
11006 Param2 = 1;
11007 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11008 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
11009 break;
11010 case ARM::BI__builtin_arm_mve_vrshlq_m_u8:
11011 Param0 = 0;
11012 Param1 = 1;
11013 Param2 = 1;
11014 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11015 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11016 break;
11017 case ARM::BI__builtin_arm_mve_vshlq_m_s16:
11018 Param0 = 0;
11019 Param1 = 0;
11020 Param2 = 0;
11021 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11022 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11023 break;
11024 case ARM::BI__builtin_arm_mve_vshlq_m_s32:
11025 Param0 = 0;
11026 Param1 = 0;
11027 Param2 = 0;
11028 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11029 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
11030 break;
11031 case ARM::BI__builtin_arm_mve_vshlq_m_s8:
11032 Param0 = 0;
11033 Param1 = 0;
11034 Param2 = 0;
11035 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11036 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11037 break;
11038 case ARM::BI__builtin_arm_mve_vshlq_m_u16:
11039 Param0 = 0;
11040 Param1 = 0;
11041 Param2 = 1;
11042 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11043 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11044 break;
11045 case ARM::BI__builtin_arm_mve_vshlq_m_u32:
11046 Param0 = 0;
11047 Param1 = 0;
11048 Param2 = 1;
11049 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11050 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
11051 break;
11052 case ARM::BI__builtin_arm_mve_vshlq_m_u8:
11053 Param0 = 0;
11054 Param1 = 0;
11055 Param2 = 1;
11056 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11057 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11058 break;
11059 }
11060 Value *Val0 = EmitScalarExpr(E->getArg(1));
11061 Value *Val1 = EmitScalarExpr(E->getArg(2));
11062 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
11063 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
11064 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param2);
11065 Value *Val5 = EmitScalarExpr(E->getArg(3));
11066 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
11067 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val6});
11068 Value *Val8 = EmitScalarExpr(E->getArg(0));
11069 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_vector_predicated, {Param4, Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val7, Val8});
11070 }
11071 case ARM::BI__builtin_arm_mve_vaddlvaq_s32:
11072 case ARM::BI__builtin_arm_mve_vaddlvaq_u32:
11073 case ARM::BI__builtin_arm_mve_vaddvaq_s16:
11074 case ARM::BI__builtin_arm_mve_vaddvaq_s32:
11075 case ARM::BI__builtin_arm_mve_vaddvaq_s8:
11076 case ARM::BI__builtin_arm_mve_vaddvaq_u16:
11077 case ARM::BI__builtin_arm_mve_vaddvaq_u32:
11078 case ARM::BI__builtin_arm_mve_vaddvaq_u8: {
11079 uint32_t Param0;
11080 Intrinsic::ID Param1;
11081 llvm::Type * Param2;
11082 switch (BuiltinID) {
11083 case ARM::BI__builtin_arm_mve_vaddlvaq_s32:
11084 Param0 = 0;
11085 Param1 = Intrinsic::arm_mve_addlv;
11086 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11087 break;
11088 case ARM::BI__builtin_arm_mve_vaddlvaq_u32:
11089 Param0 = 1;
11090 Param1 = Intrinsic::arm_mve_addlv;
11091 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11092 break;
11093 case ARM::BI__builtin_arm_mve_vaddvaq_s16:
11094 Param0 = 0;
11095 Param1 = Intrinsic::arm_mve_addv;
11096 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11097 break;
11098 case ARM::BI__builtin_arm_mve_vaddvaq_s32:
11099 Param0 = 0;
11100 Param1 = Intrinsic::arm_mve_addv;
11101 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11102 break;
11103 case ARM::BI__builtin_arm_mve_vaddvaq_s8:
11104 Param0 = 0;
11105 Param1 = Intrinsic::arm_mve_addv;
11106 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11107 break;
11108 case ARM::BI__builtin_arm_mve_vaddvaq_u16:
11109 Param0 = 1;
11110 Param1 = Intrinsic::arm_mve_addv;
11111 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11112 break;
11113 case ARM::BI__builtin_arm_mve_vaddvaq_u32:
11114 Param0 = 1;
11115 Param1 = Intrinsic::arm_mve_addv;
11116 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11117 break;
11118 case ARM::BI__builtin_arm_mve_vaddvaq_u8:
11119 Param0 = 1;
11120 Param1 = Intrinsic::arm_mve_addv;
11121 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11122 break;
11123 }
11124 Value *Val0 = EmitScalarExpr(E->getArg(1));
11125 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
11126 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1});
11127 Value *Val3 = EmitScalarExpr(E->getArg(0));
11128 return Builder.CreateAdd(Val2, Val3);
11129 }
11130 case ARM::BI__builtin_arm_mve_vaddlvaq_p_s32:
11131 case ARM::BI__builtin_arm_mve_vaddlvaq_p_u32:
11132 case ARM::BI__builtin_arm_mve_vaddvaq_p_s16:
11133 case ARM::BI__builtin_arm_mve_vaddvaq_p_s32:
11134 case ARM::BI__builtin_arm_mve_vaddvaq_p_s8:
11135 case ARM::BI__builtin_arm_mve_vaddvaq_p_u16:
11136 case ARM::BI__builtin_arm_mve_vaddvaq_p_u32:
11137 case ARM::BI__builtin_arm_mve_vaddvaq_p_u8: {
11138 uint32_t Param0;
11139 llvm::Type * Param1;
11140 Intrinsic::ID Param2;
11141 llvm::Type * Param3;
11142 switch (BuiltinID) {
11143 case ARM::BI__builtin_arm_mve_vaddlvaq_p_s32:
11144 Param0 = 0;
11145 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11146 Param2 = Intrinsic::arm_mve_addlv_predicated;
11147 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11148 break;
11149 case ARM::BI__builtin_arm_mve_vaddlvaq_p_u32:
11150 Param0 = 1;
11151 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11152 Param2 = Intrinsic::arm_mve_addlv_predicated;
11153 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11154 break;
11155 case ARM::BI__builtin_arm_mve_vaddvaq_p_s16:
11156 Param0 = 0;
11157 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11158 Param2 = Intrinsic::arm_mve_addv_predicated;
11159 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11160 break;
11161 case ARM::BI__builtin_arm_mve_vaddvaq_p_s32:
11162 Param0 = 0;
11163 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11164 Param2 = Intrinsic::arm_mve_addv_predicated;
11165 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11166 break;
11167 case ARM::BI__builtin_arm_mve_vaddvaq_p_s8:
11168 Param0 = 0;
11169 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11170 Param2 = Intrinsic::arm_mve_addv_predicated;
11171 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
11172 break;
11173 case ARM::BI__builtin_arm_mve_vaddvaq_p_u16:
11174 Param0 = 1;
11175 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11176 Param2 = Intrinsic::arm_mve_addv_predicated;
11177 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11178 break;
11179 case ARM::BI__builtin_arm_mve_vaddvaq_p_u32:
11180 Param0 = 1;
11181 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11182 Param2 = Intrinsic::arm_mve_addv_predicated;
11183 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11184 break;
11185 case ARM::BI__builtin_arm_mve_vaddvaq_p_u8:
11186 Param0 = 1;
11187 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11188 Param2 = Intrinsic::arm_mve_addv_predicated;
11189 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
11190 break;
11191 }
11192 Value *Val0 = EmitScalarExpr(E->getArg(1));
11193 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
11194 Value *Val2 = EmitScalarExpr(E->getArg(2));
11195 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
11196 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
11197 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val4});
11198 Value *Val6 = EmitScalarExpr(E->getArg(0));
11199 return Builder.CreateAdd(Val5, Val6);
11200 }
11201 case ARM::BI__builtin_arm_mve_vcvtq_m_f16_s16:
11202 case ARM::BI__builtin_arm_mve_vcvtq_m_f16_u16:
11203 case ARM::BI__builtin_arm_mve_vcvtq_m_f32_s32:
11204 case ARM::BI__builtin_arm_mve_vcvtq_m_f32_u32:
11205 case ARM::BI__builtin_arm_mve_vcvtq_m_s16_f16:
11206 case ARM::BI__builtin_arm_mve_vcvtq_m_s32_f32:
11207 case ARM::BI__builtin_arm_mve_vcvtq_m_u16_f16:
11208 case ARM::BI__builtin_arm_mve_vcvtq_m_u32_f32: {
11209 uint32_t Param0;
11210 llvm::Type * Param1;
11211 llvm::Type * Param2;
11212 llvm::Type * Param3;
11213 switch (BuiltinID) {
11214 case ARM::BI__builtin_arm_mve_vcvtq_m_f16_s16:
11215 Param0 = 0;
11216 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11217 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
11218 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11219 break;
11220 case ARM::BI__builtin_arm_mve_vcvtq_m_f16_u16:
11221 Param0 = 1;
11222 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11223 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
11224 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11225 break;
11226 case ARM::BI__builtin_arm_mve_vcvtq_m_f32_s32:
11227 Param0 = 0;
11228 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11229 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
11230 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11231 break;
11232 case ARM::BI__builtin_arm_mve_vcvtq_m_f32_u32:
11233 Param0 = 1;
11234 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11235 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
11236 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11237 break;
11238 case ARM::BI__builtin_arm_mve_vcvtq_m_s16_f16:
11239 Param0 = 0;
11240 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11241 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11242 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
11243 break;
11244 case ARM::BI__builtin_arm_mve_vcvtq_m_s32_f32:
11245 Param0 = 0;
11246 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11247 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11248 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
11249 break;
11250 case ARM::BI__builtin_arm_mve_vcvtq_m_u16_f16:
11251 Param0 = 1;
11252 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11253 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11254 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
11255 break;
11256 case ARM::BI__builtin_arm_mve_vcvtq_m_u32_f32:
11257 Param0 = 1;
11258 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11259 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11260 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
11261 break;
11262 }
11263 Value *Val0 = EmitScalarExpr(E->getArg(1));
11264 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
11265 Value *Val2 = EmitScalarExpr(E->getArg(2));
11266 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
11267 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
11268 Value *Val5 = EmitScalarExpr(E->getArg(0));
11269 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {Param2, Param3, Param1}), {Val0, Val1, Val4, Val5});
11270 }
11271 case ARM::BI__builtin_arm_mve_vrev16q_m_s8:
11272 case ARM::BI__builtin_arm_mve_vrev16q_m_u8:
11273 case ARM::BI__builtin_arm_mve_vrev32q_m_f16:
11274 case ARM::BI__builtin_arm_mve_vrev32q_m_s16:
11275 case ARM::BI__builtin_arm_mve_vrev32q_m_s8:
11276 case ARM::BI__builtin_arm_mve_vrev32q_m_u16:
11277 case ARM::BI__builtin_arm_mve_vrev32q_m_u8:
11278 case ARM::BI__builtin_arm_mve_vrev64q_m_f16:
11279 case ARM::BI__builtin_arm_mve_vrev64q_m_f32:
11280 case ARM::BI__builtin_arm_mve_vrev64q_m_s16:
11281 case ARM::BI__builtin_arm_mve_vrev64q_m_s32:
11282 case ARM::BI__builtin_arm_mve_vrev64q_m_s8:
11283 case ARM::BI__builtin_arm_mve_vrev64q_m_u16:
11284 case ARM::BI__builtin_arm_mve_vrev64q_m_u32:
11285 case ARM::BI__builtin_arm_mve_vrev64q_m_u8: {
11286 uint32_t Param0;
11287 llvm::Type * Param1;
11288 llvm::Type * Param2;
11289 switch (BuiltinID) {
11290 case ARM::BI__builtin_arm_mve_vrev16q_m_s8:
11291 Param0 = 16;
11292 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11293 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11294 break;
11295 case ARM::BI__builtin_arm_mve_vrev16q_m_u8:
11296 Param0 = 16;
11297 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11298 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11299 break;
11300 case ARM::BI__builtin_arm_mve_vrev32q_m_f16:
11301 Param0 = 32;
11302 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11303 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
11304 break;
11305 case ARM::BI__builtin_arm_mve_vrev32q_m_s16:
11306 Param0 = 32;
11307 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11308 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11309 break;
11310 case ARM::BI__builtin_arm_mve_vrev32q_m_s8:
11311 Param0 = 32;
11312 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11313 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11314 break;
11315 case ARM::BI__builtin_arm_mve_vrev32q_m_u16:
11316 Param0 = 32;
11317 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11318 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11319 break;
11320 case ARM::BI__builtin_arm_mve_vrev32q_m_u8:
11321 Param0 = 32;
11322 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11323 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11324 break;
11325 case ARM::BI__builtin_arm_mve_vrev64q_m_f16:
11326 Param0 = 64;
11327 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11328 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
11329 break;
11330 case ARM::BI__builtin_arm_mve_vrev64q_m_f32:
11331 Param0 = 64;
11332 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11333 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
11334 break;
11335 case ARM::BI__builtin_arm_mve_vrev64q_m_s16:
11336 Param0 = 64;
11337 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11338 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11339 break;
11340 case ARM::BI__builtin_arm_mve_vrev64q_m_s32:
11341 Param0 = 64;
11342 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11343 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11344 break;
11345 case ARM::BI__builtin_arm_mve_vrev64q_m_s8:
11346 Param0 = 64;
11347 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11348 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11349 break;
11350 case ARM::BI__builtin_arm_mve_vrev64q_m_u16:
11351 Param0 = 64;
11352 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11353 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
11354 break;
11355 case ARM::BI__builtin_arm_mve_vrev64q_m_u32:
11356 Param0 = 64;
11357 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11358 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
11359 break;
11360 case ARM::BI__builtin_arm_mve_vrev64q_m_u8:
11361 Param0 = 64;
11362 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
11363 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
11364 break;
11365 }
11366 Value *Val0 = EmitScalarExpr(E->getArg(1));
11367 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
11368 Value *Val2 = EmitScalarExpr(E->getArg(2));
11369 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
11370 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val3});
11371 Value *Val5 = EmitScalarExpr(E->getArg(0));
11372 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {Param2, Param1}), {Val0, Val1, Val4, Val5});
11373 }
11374 case ARM::BI__builtin_arm_mve_vmovlbq_m_s16:
11375 case ARM::BI__builtin_arm_mve_vmovlbq_m_s8:
11376 case ARM::BI__builtin_arm_mve_vmovlbq_m_u16:
11377 case ARM::BI__builtin_arm_mve_vmovlbq_m_u8:
11378 case ARM::BI__builtin_arm_mve_vmovltq_m_s16:
11379 case ARM::BI__builtin_arm_mve_vmovltq_m_s8:
11380 case ARM::BI__builtin_arm_mve_vmovltq_m_u16:
11381 case ARM::BI__builtin_arm_mve_vmovltq_m_u8: {
11382 uint32_t Param0;
11383 uint32_t Param1;
11384 llvm::Type * Param2;
11385 llvm::Type * Param3;
11386 llvm::Type * Param4;
11387 switch (BuiltinID) {
11388 case ARM::BI__builtin_arm_mve_vmovlbq_m_s16:
11389 Param0 = 0;
11390 Param1 = 0;
11391 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11392 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11393 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11394 break;
11395 case ARM::BI__builtin_arm_mve_vmovlbq_m_s8:
11396 Param0 = 0;
11397 Param1 = 0;
11398 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11399 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11400 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11401 break;
11402 case ARM::BI__builtin_arm_mve_vmovlbq_m_u16:
11403 Param0 = 1;
11404 Param1 = 0;
11405 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11406 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11407 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11408 break;
11409 case ARM::BI__builtin_arm_mve_vmovlbq_m_u8:
11410 Param0 = 1;
11411 Param1 = 0;
11412 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11413 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11414 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11415 break;
11416 case ARM::BI__builtin_arm_mve_vmovltq_m_s16:
11417 Param0 = 0;
11418 Param1 = 1;
11419 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11420 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11421 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11422 break;
11423 case ARM::BI__builtin_arm_mve_vmovltq_m_s8:
11424 Param0 = 0;
11425 Param1 = 1;
11426 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11427 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11428 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11429 break;
11430 case ARM::BI__builtin_arm_mve_vmovltq_m_u16:
11431 Param0 = 1;
11432 Param1 = 1;
11433 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11434 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
11435 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
11436 break;
11437 case ARM::BI__builtin_arm_mve_vmovltq_m_u8:
11438 Param0 = 1;
11439 Param1 = 1;
11440 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11441 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
11442 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
11443 break;
11444 }
11445 Value *Val0 = EmitScalarExpr(E->getArg(1));
11446 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param0);
11447 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param1);
11448 Value *Val3 = EmitScalarExpr(E->getArg(2));
11449 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
11450 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val4});
11451 Value *Val6 = EmitScalarExpr(E->getArg(0));
11452 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmovl_predicated, {Param3, Param4, Param2}), {Val0, Val1, Val2, Val5, Val6});
11453 }
11454 case ARM::BI__builtin_arm_mve_vstrhq_s32:
11455 case ARM::BI__builtin_arm_mve_vstrhq_u32: {
11456 Value *Val0 = EmitScalarExpr(E->getArg(1));
11457 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 4);
11458 Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11459 Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11460 Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
11461 Address Val5 = Address(Val4, llvm::FixedVectorType::get(Int16Ty, 4), CharUnits::fromQuantity(2));
11462 return Builder.CreateStore(Val2, Val5);
11463 }
11464 case ARM::BI__builtin_arm_mve_vstrhq_p_s32:
11465 case ARM::BI__builtin_arm_mve_vstrhq_p_u32: {
11466 Value *Val0 = EmitScalarExpr(E->getArg(1));
11467 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 4);
11468 Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11469 Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11470 Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4)));
11471 Value *Val5 = llvm::ConstantInt::get(Int32Ty, 2);
11472 Value *Val6 = EmitScalarExpr(E->getArg(2));
11473 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11474 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
11475 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_store, {llvm::FixedVectorType::get(Int16Ty, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int16Ty, 4))}), {Val2, Val4, Val5, Val8});
11476 }
11477 case ARM::BI__builtin_arm_mve_vandq_m_f16:
11478 case ARM::BI__builtin_arm_mve_vbicq_m_f16:
11479 case ARM::BI__builtin_arm_mve_veorq_m_f16:
11480 case ARM::BI__builtin_arm_mve_vornq_m_f16:
11481 case ARM::BI__builtin_arm_mve_vorrq_m_f16: {
11482 Intrinsic::ID Param0;
11483 switch (BuiltinID) {
11484 case ARM::BI__builtin_arm_mve_vandq_m_f16:
11485 Param0 = Intrinsic::arm_mve_and_predicated;
11486 break;
11487 case ARM::BI__builtin_arm_mve_vbicq_m_f16:
11488 Param0 = Intrinsic::arm_mve_bic_predicated;
11489 break;
11490 case ARM::BI__builtin_arm_mve_veorq_m_f16:
11491 Param0 = Intrinsic::arm_mve_eor_predicated;
11492 break;
11493 case ARM::BI__builtin_arm_mve_vornq_m_f16:
11494 Param0 = Intrinsic::arm_mve_orn_predicated;
11495 break;
11496 case ARM::BI__builtin_arm_mve_vorrq_m_f16:
11497 Param0 = Intrinsic::arm_mve_orr_predicated;
11498 break;
11499 }
11500 Value *Val0 = EmitScalarExpr(E->getArg(1));
11501 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
11502 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
11503 Value *Val3 = EmitScalarExpr(E->getArg(2));
11504 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
11505 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
11506 Value *Val6 = EmitScalarExpr(E->getArg(3));
11507 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11508 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
11509 Value *Val9 = EmitScalarExpr(E->getArg(0));
11510 llvm::Type *Val10 = llvm::FixedVectorType::get(Int16Ty, 8);
11511 Value *Val11 = Builder.CreateBitCast(Val9, Val10);
11512 Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val8, Val11});
11513 llvm::Type *Val13 = llvm::FixedVectorType::get(HalfTy, 8);
11514 return Builder.CreateBitCast(Val12, Val13);
11515 }
11516 case ARM::BI__builtin_arm_mve_vandq_m_s16:
11517 case ARM::BI__builtin_arm_mve_vandq_m_u16:
11518 case ARM::BI__builtin_arm_mve_vbicq_m_s16:
11519 case ARM::BI__builtin_arm_mve_vbicq_m_u16:
11520 case ARM::BI__builtin_arm_mve_veorq_m_s16:
11521 case ARM::BI__builtin_arm_mve_veorq_m_u16:
11522 case ARM::BI__builtin_arm_mve_vornq_m_s16:
11523 case ARM::BI__builtin_arm_mve_vornq_m_u16:
11524 case ARM::BI__builtin_arm_mve_vorrq_m_s16:
11525 case ARM::BI__builtin_arm_mve_vorrq_m_u16: {
11526 Intrinsic::ID Param0;
11527 switch (BuiltinID) {
11528 case ARM::BI__builtin_arm_mve_vandq_m_s16:
11529 Param0 = Intrinsic::arm_mve_and_predicated;
11530 break;
11531 case ARM::BI__builtin_arm_mve_vandq_m_u16:
11532 Param0 = Intrinsic::arm_mve_and_predicated;
11533 break;
11534 case ARM::BI__builtin_arm_mve_vbicq_m_s16:
11535 Param0 = Intrinsic::arm_mve_bic_predicated;
11536 break;
11537 case ARM::BI__builtin_arm_mve_vbicq_m_u16:
11538 Param0 = Intrinsic::arm_mve_bic_predicated;
11539 break;
11540 case ARM::BI__builtin_arm_mve_veorq_m_s16:
11541 Param0 = Intrinsic::arm_mve_eor_predicated;
11542 break;
11543 case ARM::BI__builtin_arm_mve_veorq_m_u16:
11544 Param0 = Intrinsic::arm_mve_eor_predicated;
11545 break;
11546 case ARM::BI__builtin_arm_mve_vornq_m_s16:
11547 Param0 = Intrinsic::arm_mve_orn_predicated;
11548 break;
11549 case ARM::BI__builtin_arm_mve_vornq_m_u16:
11550 Param0 = Intrinsic::arm_mve_orn_predicated;
11551 break;
11552 case ARM::BI__builtin_arm_mve_vorrq_m_s16:
11553 Param0 = Intrinsic::arm_mve_orr_predicated;
11554 break;
11555 case ARM::BI__builtin_arm_mve_vorrq_m_u16:
11556 Param0 = Intrinsic::arm_mve_orr_predicated;
11557 break;
11558 }
11559 Value *Val0 = EmitScalarExpr(E->getArg(1));
11560 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
11561 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
11562 Value *Val3 = EmitScalarExpr(E->getArg(2));
11563 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
11564 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
11565 Value *Val6 = EmitScalarExpr(E->getArg(3));
11566 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11567 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
11568 Value *Val9 = EmitScalarExpr(E->getArg(0));
11569 llvm::Type *Val10 = llvm::FixedVectorType::get(Int16Ty, 8);
11570 Value *Val11 = Builder.CreateBitCast(Val9, Val10);
11571 Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val8, Val11});
11572 llvm::Type *Val13 = llvm::FixedVectorType::get(Int16Ty, 8);
11573 return Builder.CreateBitCast(Val12, Val13);
11574 }
11575 case ARM::BI__builtin_arm_mve_vmaxaq_s16: {
11576 Value *Val0 = EmitScalarExpr(E->getArg(1));
11577 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
11578 Value *Val2 = llvm::Constant::getNullValue(Val1);
11579 Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11580 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
11581 Value *Val5 = llvm::Constant::getNullValue(Val4);
11582 Value *Val6 = Builder.CreateSub(Val5, Val0);
11583 Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11584 Value *Val8 = EmitScalarExpr(E->getArg(0));
11585 Value *Val9 = Builder.CreateICmpUGE(Val8, Val7);
11586 return Builder.CreateSelect(Val9, Val8, Val7);
11587 }
11588 case ARM::BI__builtin_arm_mve_vminaq_s16: {
11589 Value *Val0 = EmitScalarExpr(E->getArg(1));
11590 llvm::Type *Val1 = llvm::FixedVectorType::get(Int16Ty, 8);
11591 Value *Val2 = llvm::Constant::getNullValue(Val1);
11592 Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11593 llvm::Type *Val4 = llvm::FixedVectorType::get(Int16Ty, 8);
11594 Value *Val5 = llvm::Constant::getNullValue(Val4);
11595 Value *Val6 = Builder.CreateSub(Val5, Val0);
11596 Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11597 Value *Val8 = EmitScalarExpr(E->getArg(0));
11598 Value *Val9 = Builder.CreateICmpULE(Val8, Val7);
11599 return Builder.CreateSelect(Val9, Val8, Val7);
11600 }
11601 case ARM::BI__builtin_arm_mve_vandq_m_f32:
11602 case ARM::BI__builtin_arm_mve_vbicq_m_f32:
11603 case ARM::BI__builtin_arm_mve_veorq_m_f32:
11604 case ARM::BI__builtin_arm_mve_vornq_m_f32:
11605 case ARM::BI__builtin_arm_mve_vorrq_m_f32: {
11606 Intrinsic::ID Param0;
11607 switch (BuiltinID) {
11608 case ARM::BI__builtin_arm_mve_vandq_m_f32:
11609 Param0 = Intrinsic::arm_mve_and_predicated;
11610 break;
11611 case ARM::BI__builtin_arm_mve_vbicq_m_f32:
11612 Param0 = Intrinsic::arm_mve_bic_predicated;
11613 break;
11614 case ARM::BI__builtin_arm_mve_veorq_m_f32:
11615 Param0 = Intrinsic::arm_mve_eor_predicated;
11616 break;
11617 case ARM::BI__builtin_arm_mve_vornq_m_f32:
11618 Param0 = Intrinsic::arm_mve_orn_predicated;
11619 break;
11620 case ARM::BI__builtin_arm_mve_vorrq_m_f32:
11621 Param0 = Intrinsic::arm_mve_orr_predicated;
11622 break;
11623 }
11624 Value *Val0 = EmitScalarExpr(E->getArg(1));
11625 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
11626 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
11627 Value *Val3 = EmitScalarExpr(E->getArg(2));
11628 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
11629 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
11630 Value *Val6 = EmitScalarExpr(E->getArg(3));
11631 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11632 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
11633 Value *Val9 = EmitScalarExpr(E->getArg(0));
11634 llvm::Type *Val10 = llvm::FixedVectorType::get(Int32Ty, 4);
11635 Value *Val11 = Builder.CreateBitCast(Val9, Val10);
11636 Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val8, Val11});
11637 llvm::Type *Val13 = llvm::FixedVectorType::get(FloatTy, 4);
11638 return Builder.CreateBitCast(Val12, Val13);
11639 }
11640 case ARM::BI__builtin_arm_mve_vandq_m_s32:
11641 case ARM::BI__builtin_arm_mve_vandq_m_u32:
11642 case ARM::BI__builtin_arm_mve_vbicq_m_s32:
11643 case ARM::BI__builtin_arm_mve_vbicq_m_u32:
11644 case ARM::BI__builtin_arm_mve_veorq_m_s32:
11645 case ARM::BI__builtin_arm_mve_veorq_m_u32:
11646 case ARM::BI__builtin_arm_mve_vornq_m_s32:
11647 case ARM::BI__builtin_arm_mve_vornq_m_u32:
11648 case ARM::BI__builtin_arm_mve_vorrq_m_s32:
11649 case ARM::BI__builtin_arm_mve_vorrq_m_u32: {
11650 Intrinsic::ID Param0;
11651 switch (BuiltinID) {
11652 case ARM::BI__builtin_arm_mve_vandq_m_s32:
11653 Param0 = Intrinsic::arm_mve_and_predicated;
11654 break;
11655 case ARM::BI__builtin_arm_mve_vandq_m_u32:
11656 Param0 = Intrinsic::arm_mve_and_predicated;
11657 break;
11658 case ARM::BI__builtin_arm_mve_vbicq_m_s32:
11659 Param0 = Intrinsic::arm_mve_bic_predicated;
11660 break;
11661 case ARM::BI__builtin_arm_mve_vbicq_m_u32:
11662 Param0 = Intrinsic::arm_mve_bic_predicated;
11663 break;
11664 case ARM::BI__builtin_arm_mve_veorq_m_s32:
11665 Param0 = Intrinsic::arm_mve_eor_predicated;
11666 break;
11667 case ARM::BI__builtin_arm_mve_veorq_m_u32:
11668 Param0 = Intrinsic::arm_mve_eor_predicated;
11669 break;
11670 case ARM::BI__builtin_arm_mve_vornq_m_s32:
11671 Param0 = Intrinsic::arm_mve_orn_predicated;
11672 break;
11673 case ARM::BI__builtin_arm_mve_vornq_m_u32:
11674 Param0 = Intrinsic::arm_mve_orn_predicated;
11675 break;
11676 case ARM::BI__builtin_arm_mve_vorrq_m_s32:
11677 Param0 = Intrinsic::arm_mve_orr_predicated;
11678 break;
11679 case ARM::BI__builtin_arm_mve_vorrq_m_u32:
11680 Param0 = Intrinsic::arm_mve_orr_predicated;
11681 break;
11682 }
11683 Value *Val0 = EmitScalarExpr(E->getArg(1));
11684 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
11685 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
11686 Value *Val3 = EmitScalarExpr(E->getArg(2));
11687 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
11688 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
11689 Value *Val6 = EmitScalarExpr(E->getArg(3));
11690 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11691 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
11692 Value *Val9 = EmitScalarExpr(E->getArg(0));
11693 llvm::Type *Val10 = llvm::FixedVectorType::get(Int32Ty, 4);
11694 Value *Val11 = Builder.CreateBitCast(Val9, Val10);
11695 Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val8, Val11});
11696 llvm::Type *Val13 = llvm::FixedVectorType::get(Int32Ty, 4);
11697 return Builder.CreateBitCast(Val12, Val13);
11698 }
11699 case ARM::BI__builtin_arm_mve_vmaxaq_s32: {
11700 Value *Val0 = EmitScalarExpr(E->getArg(1));
11701 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
11702 Value *Val2 = llvm::Constant::getNullValue(Val1);
11703 Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11704 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
11705 Value *Val5 = llvm::Constant::getNullValue(Val4);
11706 Value *Val6 = Builder.CreateSub(Val5, Val0);
11707 Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11708 Value *Val8 = EmitScalarExpr(E->getArg(0));
11709 Value *Val9 = Builder.CreateICmpUGE(Val8, Val7);
11710 return Builder.CreateSelect(Val9, Val8, Val7);
11711 }
11712 case ARM::BI__builtin_arm_mve_vminaq_s32: {
11713 Value *Val0 = EmitScalarExpr(E->getArg(1));
11714 llvm::Type *Val1 = llvm::FixedVectorType::get(Int32Ty, 4);
11715 Value *Val2 = llvm::Constant::getNullValue(Val1);
11716 Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11717 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
11718 Value *Val5 = llvm::Constant::getNullValue(Val4);
11719 Value *Val6 = Builder.CreateSub(Val5, Val0);
11720 Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11721 Value *Val8 = EmitScalarExpr(E->getArg(0));
11722 Value *Val9 = Builder.CreateICmpULE(Val8, Val7);
11723 return Builder.CreateSelect(Val9, Val8, Val7);
11724 }
11725 case ARM::BI__builtin_arm_mve_vandq_m_s8:
11726 case ARM::BI__builtin_arm_mve_vandq_m_u8:
11727 case ARM::BI__builtin_arm_mve_vbicq_m_s8:
11728 case ARM::BI__builtin_arm_mve_vbicq_m_u8:
11729 case ARM::BI__builtin_arm_mve_veorq_m_s8:
11730 case ARM::BI__builtin_arm_mve_veorq_m_u8:
11731 case ARM::BI__builtin_arm_mve_vornq_m_s8:
11732 case ARM::BI__builtin_arm_mve_vornq_m_u8:
11733 case ARM::BI__builtin_arm_mve_vorrq_m_s8:
11734 case ARM::BI__builtin_arm_mve_vorrq_m_u8: {
11735 Intrinsic::ID Param0;
11736 switch (BuiltinID) {
11737 case ARM::BI__builtin_arm_mve_vandq_m_s8:
11738 Param0 = Intrinsic::arm_mve_and_predicated;
11739 break;
11740 case ARM::BI__builtin_arm_mve_vandq_m_u8:
11741 Param0 = Intrinsic::arm_mve_and_predicated;
11742 break;
11743 case ARM::BI__builtin_arm_mve_vbicq_m_s8:
11744 Param0 = Intrinsic::arm_mve_bic_predicated;
11745 break;
11746 case ARM::BI__builtin_arm_mve_vbicq_m_u8:
11747 Param0 = Intrinsic::arm_mve_bic_predicated;
11748 break;
11749 case ARM::BI__builtin_arm_mve_veorq_m_s8:
11750 Param0 = Intrinsic::arm_mve_eor_predicated;
11751 break;
11752 case ARM::BI__builtin_arm_mve_veorq_m_u8:
11753 Param0 = Intrinsic::arm_mve_eor_predicated;
11754 break;
11755 case ARM::BI__builtin_arm_mve_vornq_m_s8:
11756 Param0 = Intrinsic::arm_mve_orn_predicated;
11757 break;
11758 case ARM::BI__builtin_arm_mve_vornq_m_u8:
11759 Param0 = Intrinsic::arm_mve_orn_predicated;
11760 break;
11761 case ARM::BI__builtin_arm_mve_vorrq_m_s8:
11762 Param0 = Intrinsic::arm_mve_orr_predicated;
11763 break;
11764 case ARM::BI__builtin_arm_mve_vorrq_m_u8:
11765 Param0 = Intrinsic::arm_mve_orr_predicated;
11766 break;
11767 }
11768 Value *Val0 = EmitScalarExpr(E->getArg(1));
11769 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
11770 Value *Val2 = Builder.CreateBitCast(Val0, Val1);
11771 Value *Val3 = EmitScalarExpr(E->getArg(2));
11772 llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
11773 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
11774 Value *Val6 = EmitScalarExpr(E->getArg(3));
11775 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11776 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
11777 Value *Val9 = EmitScalarExpr(E->getArg(0));
11778 llvm::Type *Val10 = llvm::FixedVectorType::get(Int8Ty, 16);
11779 Value *Val11 = Builder.CreateBitCast(Val9, Val10);
11780 Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val5, Val8, Val11});
11781 llvm::Type *Val13 = llvm::FixedVectorType::get(Int8Ty, 16);
11782 return Builder.CreateBitCast(Val12, Val13);
11783 }
11784 case ARM::BI__builtin_arm_mve_vmaxaq_s8: {
11785 Value *Val0 = EmitScalarExpr(E->getArg(1));
11786 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
11787 Value *Val2 = llvm::Constant::getNullValue(Val1);
11788 Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11789 llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
11790 Value *Val5 = llvm::Constant::getNullValue(Val4);
11791 Value *Val6 = Builder.CreateSub(Val5, Val0);
11792 Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11793 Value *Val8 = EmitScalarExpr(E->getArg(0));
11794 Value *Val9 = Builder.CreateICmpUGE(Val8, Val7);
11795 return Builder.CreateSelect(Val9, Val8, Val7);
11796 }
11797 case ARM::BI__builtin_arm_mve_vminaq_s8: {
11798 Value *Val0 = EmitScalarExpr(E->getArg(1));
11799 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 16);
11800 Value *Val2 = llvm::Constant::getNullValue(Val1);
11801 Value *Val3 = Builder.CreateICmpSLT(Val0, Val2);
11802 llvm::Type *Val4 = llvm::FixedVectorType::get(Int8Ty, 16);
11803 Value *Val5 = llvm::Constant::getNullValue(Val4);
11804 Value *Val6 = Builder.CreateSub(Val5, Val0);
11805 Value *Val7 = Builder.CreateSelect(Val3, Val6, Val0);
11806 Value *Val8 = EmitScalarExpr(E->getArg(0));
11807 Value *Val9 = Builder.CreateICmpULE(Val8, Val7);
11808 return Builder.CreateSelect(Val9, Val8, Val7);
11809 }
11810 case ARM::BI__builtin_arm_mve_vstrbq_s32:
11811 case ARM::BI__builtin_arm_mve_vstrbq_u32: {
11812 Value *Val0 = EmitScalarExpr(E->getArg(1));
11813 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 4);
11814 Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11815 Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11816 Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
11817 Address Val5 = Address(Val4, llvm::FixedVectorType::get(Int8Ty, 4), CharUnits::fromQuantity(1));
11818 return Builder.CreateStore(Val2, Val5);
11819 }
11820 case ARM::BI__builtin_arm_mve_vstrbq_p_s32:
11821 case ARM::BI__builtin_arm_mve_vstrbq_p_u32: {
11822 Value *Val0 = EmitScalarExpr(E->getArg(1));
11823 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 4);
11824 Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11825 Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11826 Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4)));
11827 Value *Val5 = llvm::ConstantInt::get(Int32Ty, 1);
11828 Value *Val6 = EmitScalarExpr(E->getArg(2));
11829 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11830 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
11831 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_store, {llvm::FixedVectorType::get(Int8Ty, 4), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 4))}), {Val2, Val4, Val5, Val8});
11832 }
11833 case ARM::BI__builtin_arm_mve_vstrbq_s16:
11834 case ARM::BI__builtin_arm_mve_vstrbq_u16: {
11835 Value *Val0 = EmitScalarExpr(E->getArg(1));
11836 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 8);
11837 Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11838 Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11839 Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
11840 Address Val5 = Address(Val4, llvm::FixedVectorType::get(Int8Ty, 8), CharUnits::fromQuantity(1));
11841 return Builder.CreateStore(Val2, Val5);
11842 }
11843 case ARM::BI__builtin_arm_mve_vstrbq_p_s16:
11844 case ARM::BI__builtin_arm_mve_vstrbq_p_u16: {
11845 Value *Val0 = EmitScalarExpr(E->getArg(1));
11846 llvm::Type *Val1 = llvm::FixedVectorType::get(Int8Ty, 8);
11847 Value *Val2 = Builder.CreateTrunc(Val0, Val1);
11848 Address Val3 = EmitPointerWithAlignment(E->getArg(0));
11849 Value *Val4 = Builder.CreatePointerCast((Val3.emitRawPointer(*this)), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8)));
11850 Value *Val5 = llvm::ConstantInt::get(Int32Ty, 1);
11851 Value *Val6 = EmitScalarExpr(E->getArg(2));
11852 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
11853 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
11854 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::masked_store, {llvm::FixedVectorType::get(Int8Ty, 8), llvm::PointerType::getUnqual(llvm::FixedVectorType::get(Int8Ty, 8))}), {Val2, Val4, Val5, Val8});
11855 }
11856 case ARM::BI__builtin_arm_mve_vfmasq_n_f16:
11857 case ARM::BI__builtin_arm_mve_vfmasq_n_f32: {
11858 llvm::Type * Param0;
11859 switch (BuiltinID) {
11860 case ARM::BI__builtin_arm_mve_vfmasq_n_f16:
11861 Param0 = llvm::FixedVectorType::get(HalfTy, 8);
11862 break;
11863 case ARM::BI__builtin_arm_mve_vfmasq_n_f32:
11864 Param0 = llvm::FixedVectorType::get(FloatTy, 4);
11865 break;
11866 }
11867 Value *Val0 = EmitScalarExpr(E->getArg(2));
11868 Value *Val1 = ARMMVEVectorSplat(Builder, Val0);
11869 Value *Val2 = EmitScalarExpr(E->getArg(0));
11870 Value *Val3 = EmitScalarExpr(E->getArg(1));
11871 Value *Val4 = (Val3);
11872 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val2, Val4, Val1});
11873 }
11874 case ARM::BI__builtin_arm_mve_vfmaq_m_n_f16:
11875 case ARM::BI__builtin_arm_mve_vfmaq_m_n_f32: {
11876 llvm::Type * Param0;
11877 llvm::Type * Param1;
11878 switch (BuiltinID) {
11879 case ARM::BI__builtin_arm_mve_vfmaq_m_n_f16:
11880 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11881 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
11882 break;
11883 case ARM::BI__builtin_arm_mve_vfmaq_m_n_f32:
11884 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11885 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
11886 break;
11887 }
11888 Value *Val0 = EmitScalarExpr(E->getArg(2));
11889 Value *Val1 = ARMMVEVectorSplat(Builder, Val0);
11890 Value *Val2 = EmitScalarExpr(E->getArg(1));
11891 Value *Val3 = (Val1);
11892 Value *Val4 = EmitScalarExpr(E->getArg(0));
11893 Value *Val5 = EmitScalarExpr(E->getArg(3));
11894 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
11895 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val6});
11896 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_fma_predicated, {Param1, Param0}), {Val2, Val3, Val4, Val7});
11897 }
11898 case ARM::BI__builtin_arm_mve_vfmaq_n_f16:
11899 case ARM::BI__builtin_arm_mve_vfmaq_n_f32: {
11900 llvm::Type * Param0;
11901 switch (BuiltinID) {
11902 case ARM::BI__builtin_arm_mve_vfmaq_n_f16:
11903 Param0 = llvm::FixedVectorType::get(HalfTy, 8);
11904 break;
11905 case ARM::BI__builtin_arm_mve_vfmaq_n_f32:
11906 Param0 = llvm::FixedVectorType::get(FloatTy, 4);
11907 break;
11908 }
11909 Value *Val0 = EmitScalarExpr(E->getArg(2));
11910 Value *Val1 = ARMMVEVectorSplat(Builder, Val0);
11911 Value *Val2 = EmitScalarExpr(E->getArg(1));
11912 Value *Val3 = (Val1);
11913 Value *Val4 = EmitScalarExpr(E->getArg(0));
11914 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param0}), {Val2, Val3, Val4});
11915 }
11916 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f16:
11917 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f32: {
11918 llvm::Type * Param0;
11919 switch (BuiltinID) {
11920 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f16:
11921 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11922 break;
11923 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_f32:
11924 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11925 break;
11926 }
11927 Value *Val0 = EmitScalarExpr(E->getArg(2));
11928 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
11929 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
11930 Value *Val3 = EmitScalarExpr(E->getArg(0));
11931 Value *Val4 = EmitScalarExpr(E->getArg(1));
11932 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
11933 Value *Val6 = Builder.CreateFCmpOEQ(Val3, Val5);
11934 Value *Val7 = Builder.CreateAnd(Val2, Val6);
11935 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
11936 return Builder.CreateIntCast(Val8, Int16Ty, false);
11937 }
11938 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f16:
11939 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f32: {
11940 llvm::Type * Param0;
11941 switch (BuiltinID) {
11942 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f16:
11943 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11944 break;
11945 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_f32:
11946 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11947 break;
11948 }
11949 Value *Val0 = EmitScalarExpr(E->getArg(2));
11950 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
11951 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
11952 Value *Val3 = EmitScalarExpr(E->getArg(0));
11953 Value *Val4 = EmitScalarExpr(E->getArg(1));
11954 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
11955 Value *Val6 = Builder.CreateFCmpOGE(Val3, Val5);
11956 Value *Val7 = Builder.CreateAnd(Val2, Val6);
11957 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
11958 return Builder.CreateIntCast(Val8, Int16Ty, false);
11959 }
11960 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f16:
11961 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f32: {
11962 llvm::Type * Param0;
11963 switch (BuiltinID) {
11964 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f16:
11965 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11966 break;
11967 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_f32:
11968 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11969 break;
11970 }
11971 Value *Val0 = EmitScalarExpr(E->getArg(2));
11972 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
11973 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
11974 Value *Val3 = EmitScalarExpr(E->getArg(0));
11975 Value *Val4 = EmitScalarExpr(E->getArg(1));
11976 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
11977 Value *Val6 = Builder.CreateFCmpOGT(Val3, Val5);
11978 Value *Val7 = Builder.CreateAnd(Val2, Val6);
11979 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
11980 return Builder.CreateIntCast(Val8, Int16Ty, false);
11981 }
11982 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f16:
11983 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f32: {
11984 llvm::Type * Param0;
11985 switch (BuiltinID) {
11986 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f16:
11987 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
11988 break;
11989 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_f32:
11990 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
11991 break;
11992 }
11993 Value *Val0 = EmitScalarExpr(E->getArg(2));
11994 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
11995 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
11996 Value *Val3 = EmitScalarExpr(E->getArg(0));
11997 Value *Val4 = EmitScalarExpr(E->getArg(1));
11998 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
11999 Value *Val6 = Builder.CreateFCmpULE(Val3, Val5);
12000 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12001 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12002 return Builder.CreateIntCast(Val8, Int16Ty, false);
12003 }
12004 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f16:
12005 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f32: {
12006 llvm::Type * Param0;
12007 switch (BuiltinID) {
12008 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f16:
12009 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12010 break;
12011 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_f32:
12012 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12013 break;
12014 }
12015 Value *Val0 = EmitScalarExpr(E->getArg(2));
12016 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12017 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12018 Value *Val3 = EmitScalarExpr(E->getArg(0));
12019 Value *Val4 = EmitScalarExpr(E->getArg(1));
12020 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12021 Value *Val6 = Builder.CreateFCmpULT(Val3, Val5);
12022 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12023 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12024 return Builder.CreateIntCast(Val8, Int16Ty, false);
12025 }
12026 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f16:
12027 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f32: {
12028 llvm::Type * Param0;
12029 switch (BuiltinID) {
12030 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f16:
12031 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12032 break;
12033 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_f32:
12034 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12035 break;
12036 }
12037 Value *Val0 = EmitScalarExpr(E->getArg(2));
12038 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12039 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12040 Value *Val3 = EmitScalarExpr(E->getArg(0));
12041 Value *Val4 = EmitScalarExpr(E->getArg(1));
12042 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12043 Value *Val6 = Builder.CreateFCmpUNE(Val3, Val5);
12044 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12045 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12046 return Builder.CreateIntCast(Val8, Int16Ty, false);
12047 }
12048 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s16:
12049 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s32:
12050 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s8:
12051 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u16:
12052 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u32:
12053 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u8: {
12054 llvm::Type * Param0;
12055 switch (BuiltinID) {
12056 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s16:
12057 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12058 break;
12059 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s32:
12060 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12061 break;
12062 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_s8:
12063 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12064 break;
12065 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u16:
12066 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12067 break;
12068 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u32:
12069 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12070 break;
12071 case ARM::BI__builtin_arm_mve_vcmpeqq_m_n_u8:
12072 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12073 break;
12074 }
12075 Value *Val0 = EmitScalarExpr(E->getArg(2));
12076 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12077 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12078 Value *Val3 = EmitScalarExpr(E->getArg(0));
12079 Value *Val4 = EmitScalarExpr(E->getArg(1));
12080 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12081 Value *Val6 = Builder.CreateICmpEQ(Val3, Val5);
12082 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12083 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12084 return Builder.CreateIntCast(Val8, Int16Ty, false);
12085 }
12086 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s16:
12087 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s32:
12088 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s8:
12089 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u16:
12090 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u32:
12091 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u8: {
12092 llvm::Type * Param0;
12093 switch (BuiltinID) {
12094 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s16:
12095 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12096 break;
12097 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s32:
12098 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12099 break;
12100 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_s8:
12101 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12102 break;
12103 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u16:
12104 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12105 break;
12106 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u32:
12107 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12108 break;
12109 case ARM::BI__builtin_arm_mve_vcmpneq_m_n_u8:
12110 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12111 break;
12112 }
12113 Value *Val0 = EmitScalarExpr(E->getArg(2));
12114 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12115 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12116 Value *Val3 = EmitScalarExpr(E->getArg(0));
12117 Value *Val4 = EmitScalarExpr(E->getArg(1));
12118 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12119 Value *Val6 = Builder.CreateICmpNE(Val3, Val5);
12120 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12121 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12122 return Builder.CreateIntCast(Val8, Int16Ty, false);
12123 }
12124 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s16:
12125 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s32:
12126 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s8: {
12127 llvm::Type * Param0;
12128 switch (BuiltinID) {
12129 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s16:
12130 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12131 break;
12132 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s32:
12133 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12134 break;
12135 case ARM::BI__builtin_arm_mve_vcmpgeq_m_n_s8:
12136 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12137 break;
12138 }
12139 Value *Val0 = EmitScalarExpr(E->getArg(2));
12140 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12141 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12142 Value *Val3 = EmitScalarExpr(E->getArg(0));
12143 Value *Val4 = EmitScalarExpr(E->getArg(1));
12144 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12145 Value *Val6 = Builder.CreateICmpSGE(Val3, Val5);
12146 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12147 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12148 return Builder.CreateIntCast(Val8, Int16Ty, false);
12149 }
12150 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s16:
12151 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s32:
12152 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s8: {
12153 llvm::Type * Param0;
12154 switch (BuiltinID) {
12155 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s16:
12156 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12157 break;
12158 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s32:
12159 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12160 break;
12161 case ARM::BI__builtin_arm_mve_vcmpgtq_m_n_s8:
12162 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12163 break;
12164 }
12165 Value *Val0 = EmitScalarExpr(E->getArg(2));
12166 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12167 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12168 Value *Val3 = EmitScalarExpr(E->getArg(0));
12169 Value *Val4 = EmitScalarExpr(E->getArg(1));
12170 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12171 Value *Val6 = Builder.CreateICmpSGT(Val3, Val5);
12172 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12173 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12174 return Builder.CreateIntCast(Val8, Int16Ty, false);
12175 }
12176 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s16:
12177 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s32:
12178 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s8: {
12179 llvm::Type * Param0;
12180 switch (BuiltinID) {
12181 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s16:
12182 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12183 break;
12184 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s32:
12185 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12186 break;
12187 case ARM::BI__builtin_arm_mve_vcmpleq_m_n_s8:
12188 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12189 break;
12190 }
12191 Value *Val0 = EmitScalarExpr(E->getArg(2));
12192 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12193 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12194 Value *Val3 = EmitScalarExpr(E->getArg(0));
12195 Value *Val4 = EmitScalarExpr(E->getArg(1));
12196 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12197 Value *Val6 = Builder.CreateICmpSLE(Val3, Val5);
12198 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12199 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12200 return Builder.CreateIntCast(Val8, Int16Ty, false);
12201 }
12202 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s16:
12203 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s32:
12204 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s8: {
12205 llvm::Type * Param0;
12206 switch (BuiltinID) {
12207 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s16:
12208 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12209 break;
12210 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s32:
12211 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12212 break;
12213 case ARM::BI__builtin_arm_mve_vcmpltq_m_n_s8:
12214 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12215 break;
12216 }
12217 Value *Val0 = EmitScalarExpr(E->getArg(2));
12218 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12219 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12220 Value *Val3 = EmitScalarExpr(E->getArg(0));
12221 Value *Val4 = EmitScalarExpr(E->getArg(1));
12222 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12223 Value *Val6 = Builder.CreateICmpSLT(Val3, Val5);
12224 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12225 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12226 return Builder.CreateIntCast(Val8, Int16Ty, false);
12227 }
12228 case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u16:
12229 case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u32:
12230 case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u8: {
12231 llvm::Type * Param0;
12232 switch (BuiltinID) {
12233 case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u16:
12234 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12235 break;
12236 case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u32:
12237 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12238 break;
12239 case ARM::BI__builtin_arm_mve_vcmpcsq_m_n_u8:
12240 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12241 break;
12242 }
12243 Value *Val0 = EmitScalarExpr(E->getArg(2));
12244 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12245 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12246 Value *Val3 = EmitScalarExpr(E->getArg(0));
12247 Value *Val4 = EmitScalarExpr(E->getArg(1));
12248 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12249 Value *Val6 = Builder.CreateICmpUGE(Val3, Val5);
12250 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12251 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12252 return Builder.CreateIntCast(Val8, Int16Ty, false);
12253 }
12254 case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u16:
12255 case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u32:
12256 case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u8: {
12257 llvm::Type * Param0;
12258 switch (BuiltinID) {
12259 case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u16:
12260 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12261 break;
12262 case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u32:
12263 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12264 break;
12265 case ARM::BI__builtin_arm_mve_vcmphiq_m_n_u8:
12266 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12267 break;
12268 }
12269 Value *Val0 = EmitScalarExpr(E->getArg(2));
12270 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12271 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12272 Value *Val3 = EmitScalarExpr(E->getArg(0));
12273 Value *Val4 = EmitScalarExpr(E->getArg(1));
12274 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12275 Value *Val6 = Builder.CreateICmpUGT(Val3, Val5);
12276 Value *Val7 = Builder.CreateAnd(Val2, Val6);
12277 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val7});
12278 return Builder.CreateIntCast(Val8, Int16Ty, false);
12279 }
12280 case ARM::BI__builtin_arm_mve_vcmpeqq_m_f16:
12281 case ARM::BI__builtin_arm_mve_vcmpeqq_m_f32: {
12282 llvm::Type * Param0;
12283 switch (BuiltinID) {
12284 case ARM::BI__builtin_arm_mve_vcmpeqq_m_f16:
12285 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12286 break;
12287 case ARM::BI__builtin_arm_mve_vcmpeqq_m_f32:
12288 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12289 break;
12290 }
12291 Value *Val0 = EmitScalarExpr(E->getArg(2));
12292 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12293 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12294 Value *Val3 = EmitScalarExpr(E->getArg(0));
12295 Value *Val4 = EmitScalarExpr(E->getArg(1));
12296 Value *Val5 = Builder.CreateFCmpOEQ(Val3, Val4);
12297 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12298 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12299 return Builder.CreateIntCast(Val7, Int16Ty, false);
12300 }
12301 case ARM::BI__builtin_arm_mve_vcmpgeq_m_f16:
12302 case ARM::BI__builtin_arm_mve_vcmpgeq_m_f32: {
12303 llvm::Type * Param0;
12304 switch (BuiltinID) {
12305 case ARM::BI__builtin_arm_mve_vcmpgeq_m_f16:
12306 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12307 break;
12308 case ARM::BI__builtin_arm_mve_vcmpgeq_m_f32:
12309 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12310 break;
12311 }
12312 Value *Val0 = EmitScalarExpr(E->getArg(2));
12313 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12314 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12315 Value *Val3 = EmitScalarExpr(E->getArg(0));
12316 Value *Val4 = EmitScalarExpr(E->getArg(1));
12317 Value *Val5 = Builder.CreateFCmpOGE(Val3, Val4);
12318 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12319 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12320 return Builder.CreateIntCast(Val7, Int16Ty, false);
12321 }
12322 case ARM::BI__builtin_arm_mve_vcmpgtq_m_f16:
12323 case ARM::BI__builtin_arm_mve_vcmpgtq_m_f32: {
12324 llvm::Type * Param0;
12325 switch (BuiltinID) {
12326 case ARM::BI__builtin_arm_mve_vcmpgtq_m_f16:
12327 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12328 break;
12329 case ARM::BI__builtin_arm_mve_vcmpgtq_m_f32:
12330 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12331 break;
12332 }
12333 Value *Val0 = EmitScalarExpr(E->getArg(2));
12334 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12335 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12336 Value *Val3 = EmitScalarExpr(E->getArg(0));
12337 Value *Val4 = EmitScalarExpr(E->getArg(1));
12338 Value *Val5 = Builder.CreateFCmpOGT(Val3, Val4);
12339 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12340 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12341 return Builder.CreateIntCast(Val7, Int16Ty, false);
12342 }
12343 case ARM::BI__builtin_arm_mve_vcmpleq_m_f16:
12344 case ARM::BI__builtin_arm_mve_vcmpleq_m_f32: {
12345 llvm::Type * Param0;
12346 switch (BuiltinID) {
12347 case ARM::BI__builtin_arm_mve_vcmpleq_m_f16:
12348 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12349 break;
12350 case ARM::BI__builtin_arm_mve_vcmpleq_m_f32:
12351 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12352 break;
12353 }
12354 Value *Val0 = EmitScalarExpr(E->getArg(2));
12355 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12356 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12357 Value *Val3 = EmitScalarExpr(E->getArg(0));
12358 Value *Val4 = EmitScalarExpr(E->getArg(1));
12359 Value *Val5 = Builder.CreateFCmpULE(Val3, Val4);
12360 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12361 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12362 return Builder.CreateIntCast(Val7, Int16Ty, false);
12363 }
12364 case ARM::BI__builtin_arm_mve_vcmpltq_m_f16:
12365 case ARM::BI__builtin_arm_mve_vcmpltq_m_f32: {
12366 llvm::Type * Param0;
12367 switch (BuiltinID) {
12368 case ARM::BI__builtin_arm_mve_vcmpltq_m_f16:
12369 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12370 break;
12371 case ARM::BI__builtin_arm_mve_vcmpltq_m_f32:
12372 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12373 break;
12374 }
12375 Value *Val0 = EmitScalarExpr(E->getArg(2));
12376 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12377 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12378 Value *Val3 = EmitScalarExpr(E->getArg(0));
12379 Value *Val4 = EmitScalarExpr(E->getArg(1));
12380 Value *Val5 = Builder.CreateFCmpULT(Val3, Val4);
12381 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12382 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12383 return Builder.CreateIntCast(Val7, Int16Ty, false);
12384 }
12385 case ARM::BI__builtin_arm_mve_vcmpneq_m_f16:
12386 case ARM::BI__builtin_arm_mve_vcmpneq_m_f32: {
12387 llvm::Type * Param0;
12388 switch (BuiltinID) {
12389 case ARM::BI__builtin_arm_mve_vcmpneq_m_f16:
12390 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12391 break;
12392 case ARM::BI__builtin_arm_mve_vcmpneq_m_f32:
12393 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12394 break;
12395 }
12396 Value *Val0 = EmitScalarExpr(E->getArg(2));
12397 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12398 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12399 Value *Val3 = EmitScalarExpr(E->getArg(0));
12400 Value *Val4 = EmitScalarExpr(E->getArg(1));
12401 Value *Val5 = Builder.CreateFCmpUNE(Val3, Val4);
12402 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12403 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12404 return Builder.CreateIntCast(Val7, Int16Ty, false);
12405 }
12406 case ARM::BI__builtin_arm_mve_vcmpeqq_m_s16:
12407 case ARM::BI__builtin_arm_mve_vcmpeqq_m_s32:
12408 case ARM::BI__builtin_arm_mve_vcmpeqq_m_s8:
12409 case ARM::BI__builtin_arm_mve_vcmpeqq_m_u16:
12410 case ARM::BI__builtin_arm_mve_vcmpeqq_m_u32:
12411 case ARM::BI__builtin_arm_mve_vcmpeqq_m_u8: {
12412 llvm::Type * Param0;
12413 switch (BuiltinID) {
12414 case ARM::BI__builtin_arm_mve_vcmpeqq_m_s16:
12415 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12416 break;
12417 case ARM::BI__builtin_arm_mve_vcmpeqq_m_s32:
12418 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12419 break;
12420 case ARM::BI__builtin_arm_mve_vcmpeqq_m_s8:
12421 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12422 break;
12423 case ARM::BI__builtin_arm_mve_vcmpeqq_m_u16:
12424 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12425 break;
12426 case ARM::BI__builtin_arm_mve_vcmpeqq_m_u32:
12427 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12428 break;
12429 case ARM::BI__builtin_arm_mve_vcmpeqq_m_u8:
12430 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12431 break;
12432 }
12433 Value *Val0 = EmitScalarExpr(E->getArg(2));
12434 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12435 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12436 Value *Val3 = EmitScalarExpr(E->getArg(0));
12437 Value *Val4 = EmitScalarExpr(E->getArg(1));
12438 Value *Val5 = Builder.CreateICmpEQ(Val3, Val4);
12439 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12440 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12441 return Builder.CreateIntCast(Val7, Int16Ty, false);
12442 }
12443 case ARM::BI__builtin_arm_mve_vcmpneq_m_s16:
12444 case ARM::BI__builtin_arm_mve_vcmpneq_m_s32:
12445 case ARM::BI__builtin_arm_mve_vcmpneq_m_s8:
12446 case ARM::BI__builtin_arm_mve_vcmpneq_m_u16:
12447 case ARM::BI__builtin_arm_mve_vcmpneq_m_u32:
12448 case ARM::BI__builtin_arm_mve_vcmpneq_m_u8: {
12449 llvm::Type * Param0;
12450 switch (BuiltinID) {
12451 case ARM::BI__builtin_arm_mve_vcmpneq_m_s16:
12452 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12453 break;
12454 case ARM::BI__builtin_arm_mve_vcmpneq_m_s32:
12455 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12456 break;
12457 case ARM::BI__builtin_arm_mve_vcmpneq_m_s8:
12458 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12459 break;
12460 case ARM::BI__builtin_arm_mve_vcmpneq_m_u16:
12461 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12462 break;
12463 case ARM::BI__builtin_arm_mve_vcmpneq_m_u32:
12464 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12465 break;
12466 case ARM::BI__builtin_arm_mve_vcmpneq_m_u8:
12467 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12468 break;
12469 }
12470 Value *Val0 = EmitScalarExpr(E->getArg(2));
12471 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12472 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12473 Value *Val3 = EmitScalarExpr(E->getArg(0));
12474 Value *Val4 = EmitScalarExpr(E->getArg(1));
12475 Value *Val5 = Builder.CreateICmpNE(Val3, Val4);
12476 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12477 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12478 return Builder.CreateIntCast(Val7, Int16Ty, false);
12479 }
12480 case ARM::BI__builtin_arm_mve_vcmpgeq_m_s16:
12481 case ARM::BI__builtin_arm_mve_vcmpgeq_m_s32:
12482 case ARM::BI__builtin_arm_mve_vcmpgeq_m_s8: {
12483 llvm::Type * Param0;
12484 switch (BuiltinID) {
12485 case ARM::BI__builtin_arm_mve_vcmpgeq_m_s16:
12486 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12487 break;
12488 case ARM::BI__builtin_arm_mve_vcmpgeq_m_s32:
12489 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12490 break;
12491 case ARM::BI__builtin_arm_mve_vcmpgeq_m_s8:
12492 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12493 break;
12494 }
12495 Value *Val0 = EmitScalarExpr(E->getArg(2));
12496 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12497 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12498 Value *Val3 = EmitScalarExpr(E->getArg(0));
12499 Value *Val4 = EmitScalarExpr(E->getArg(1));
12500 Value *Val5 = Builder.CreateICmpSGE(Val3, Val4);
12501 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12502 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12503 return Builder.CreateIntCast(Val7, Int16Ty, false);
12504 }
12505 case ARM::BI__builtin_arm_mve_vcmpgtq_m_s16:
12506 case ARM::BI__builtin_arm_mve_vcmpgtq_m_s32:
12507 case ARM::BI__builtin_arm_mve_vcmpgtq_m_s8: {
12508 llvm::Type * Param0;
12509 switch (BuiltinID) {
12510 case ARM::BI__builtin_arm_mve_vcmpgtq_m_s16:
12511 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12512 break;
12513 case ARM::BI__builtin_arm_mve_vcmpgtq_m_s32:
12514 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12515 break;
12516 case ARM::BI__builtin_arm_mve_vcmpgtq_m_s8:
12517 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12518 break;
12519 }
12520 Value *Val0 = EmitScalarExpr(E->getArg(2));
12521 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12522 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12523 Value *Val3 = EmitScalarExpr(E->getArg(0));
12524 Value *Val4 = EmitScalarExpr(E->getArg(1));
12525 Value *Val5 = Builder.CreateICmpSGT(Val3, Val4);
12526 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12527 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12528 return Builder.CreateIntCast(Val7, Int16Ty, false);
12529 }
12530 case ARM::BI__builtin_arm_mve_vcmpleq_m_s16:
12531 case ARM::BI__builtin_arm_mve_vcmpleq_m_s32:
12532 case ARM::BI__builtin_arm_mve_vcmpleq_m_s8: {
12533 llvm::Type * Param0;
12534 switch (BuiltinID) {
12535 case ARM::BI__builtin_arm_mve_vcmpleq_m_s16:
12536 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12537 break;
12538 case ARM::BI__builtin_arm_mve_vcmpleq_m_s32:
12539 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12540 break;
12541 case ARM::BI__builtin_arm_mve_vcmpleq_m_s8:
12542 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12543 break;
12544 }
12545 Value *Val0 = EmitScalarExpr(E->getArg(2));
12546 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12547 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12548 Value *Val3 = EmitScalarExpr(E->getArg(0));
12549 Value *Val4 = EmitScalarExpr(E->getArg(1));
12550 Value *Val5 = Builder.CreateICmpSLE(Val3, Val4);
12551 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12552 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12553 return Builder.CreateIntCast(Val7, Int16Ty, false);
12554 }
12555 case ARM::BI__builtin_arm_mve_vcmpltq_m_s16:
12556 case ARM::BI__builtin_arm_mve_vcmpltq_m_s32:
12557 case ARM::BI__builtin_arm_mve_vcmpltq_m_s8: {
12558 llvm::Type * Param0;
12559 switch (BuiltinID) {
12560 case ARM::BI__builtin_arm_mve_vcmpltq_m_s16:
12561 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12562 break;
12563 case ARM::BI__builtin_arm_mve_vcmpltq_m_s32:
12564 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12565 break;
12566 case ARM::BI__builtin_arm_mve_vcmpltq_m_s8:
12567 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12568 break;
12569 }
12570 Value *Val0 = EmitScalarExpr(E->getArg(2));
12571 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12572 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12573 Value *Val3 = EmitScalarExpr(E->getArg(0));
12574 Value *Val4 = EmitScalarExpr(E->getArg(1));
12575 Value *Val5 = Builder.CreateICmpSLT(Val3, Val4);
12576 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12577 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12578 return Builder.CreateIntCast(Val7, Int16Ty, false);
12579 }
12580 case ARM::BI__builtin_arm_mve_vcmpcsq_m_u16:
12581 case ARM::BI__builtin_arm_mve_vcmpcsq_m_u32:
12582 case ARM::BI__builtin_arm_mve_vcmpcsq_m_u8: {
12583 llvm::Type * Param0;
12584 switch (BuiltinID) {
12585 case ARM::BI__builtin_arm_mve_vcmpcsq_m_u16:
12586 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12587 break;
12588 case ARM::BI__builtin_arm_mve_vcmpcsq_m_u32:
12589 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12590 break;
12591 case ARM::BI__builtin_arm_mve_vcmpcsq_m_u8:
12592 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12593 break;
12594 }
12595 Value *Val0 = EmitScalarExpr(E->getArg(2));
12596 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12597 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12598 Value *Val3 = EmitScalarExpr(E->getArg(0));
12599 Value *Val4 = EmitScalarExpr(E->getArg(1));
12600 Value *Val5 = Builder.CreateICmpUGE(Val3, Val4);
12601 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12602 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12603 return Builder.CreateIntCast(Val7, Int16Ty, false);
12604 }
12605 case ARM::BI__builtin_arm_mve_vcmphiq_m_u16:
12606 case ARM::BI__builtin_arm_mve_vcmphiq_m_u32:
12607 case ARM::BI__builtin_arm_mve_vcmphiq_m_u8: {
12608 llvm::Type * Param0;
12609 switch (BuiltinID) {
12610 case ARM::BI__builtin_arm_mve_vcmphiq_m_u16:
12611 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12612 break;
12613 case ARM::BI__builtin_arm_mve_vcmphiq_m_u32:
12614 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12615 break;
12616 case ARM::BI__builtin_arm_mve_vcmphiq_m_u8:
12617 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12618 break;
12619 }
12620 Value *Val0 = EmitScalarExpr(E->getArg(2));
12621 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12622 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12623 Value *Val3 = EmitScalarExpr(E->getArg(0));
12624 Value *Val4 = EmitScalarExpr(E->getArg(1));
12625 Value *Val5 = Builder.CreateICmpUGT(Val3, Val4);
12626 Value *Val6 = Builder.CreateAnd(Val2, Val5);
12627 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_v2i, {Param0}), {Val6});
12628 return Builder.CreateIntCast(Val7, Int16Ty, false);
12629 }
12630 case ARM::BI__builtin_arm_mve_vpselq_f16:
12631 case ARM::BI__builtin_arm_mve_vpselq_f32:
12632 case ARM::BI__builtin_arm_mve_vpselq_s16:
12633 case ARM::BI__builtin_arm_mve_vpselq_s32:
12634 case ARM::BI__builtin_arm_mve_vpselq_s8:
12635 case ARM::BI__builtin_arm_mve_vpselq_u16:
12636 case ARM::BI__builtin_arm_mve_vpselq_u32:
12637 case ARM::BI__builtin_arm_mve_vpselq_u8: {
12638 llvm::Type * Param0;
12639 switch (BuiltinID) {
12640 case ARM::BI__builtin_arm_mve_vpselq_f16:
12641 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12642 break;
12643 case ARM::BI__builtin_arm_mve_vpselq_f32:
12644 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12645 break;
12646 case ARM::BI__builtin_arm_mve_vpselq_s16:
12647 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12648 break;
12649 case ARM::BI__builtin_arm_mve_vpselq_s32:
12650 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12651 break;
12652 case ARM::BI__builtin_arm_mve_vpselq_s8:
12653 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12654 break;
12655 case ARM::BI__builtin_arm_mve_vpselq_u16:
12656 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12657 break;
12658 case ARM::BI__builtin_arm_mve_vpselq_u32:
12659 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12660 break;
12661 case ARM::BI__builtin_arm_mve_vpselq_u8:
12662 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12663 break;
12664 }
12665 Value *Val0 = EmitScalarExpr(E->getArg(2));
12666 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12667 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12668 Value *Val3 = EmitScalarExpr(E->getArg(0));
12669 Value *Val4 = EmitScalarExpr(E->getArg(1));
12670 return Builder.CreateSelect(Val2, Val3, Val4);
12671 }
12672 case ARM::BI__builtin_arm_mve_vdupq_m_n_f16:
12673 case ARM::BI__builtin_arm_mve_vdupq_m_n_f32:
12674 case ARM::BI__builtin_arm_mve_vdupq_m_n_s16:
12675 case ARM::BI__builtin_arm_mve_vdupq_m_n_s32:
12676 case ARM::BI__builtin_arm_mve_vdupq_m_n_s8:
12677 case ARM::BI__builtin_arm_mve_vdupq_m_n_u16:
12678 case ARM::BI__builtin_arm_mve_vdupq_m_n_u32:
12679 case ARM::BI__builtin_arm_mve_vdupq_m_n_u8: {
12680 llvm::Type * Param0;
12681 switch (BuiltinID) {
12682 case ARM::BI__builtin_arm_mve_vdupq_m_n_f16:
12683 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12684 break;
12685 case ARM::BI__builtin_arm_mve_vdupq_m_n_f32:
12686 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12687 break;
12688 case ARM::BI__builtin_arm_mve_vdupq_m_n_s16:
12689 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12690 break;
12691 case ARM::BI__builtin_arm_mve_vdupq_m_n_s32:
12692 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12693 break;
12694 case ARM::BI__builtin_arm_mve_vdupq_m_n_s8:
12695 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12696 break;
12697 case ARM::BI__builtin_arm_mve_vdupq_m_n_u16:
12698 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12699 break;
12700 case ARM::BI__builtin_arm_mve_vdupq_m_n_u32:
12701 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12702 break;
12703 case ARM::BI__builtin_arm_mve_vdupq_m_n_u8:
12704 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
12705 break;
12706 }
12707 Value *Val0 = EmitScalarExpr(E->getArg(2));
12708 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12709 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12710 Value *Val3 = EmitScalarExpr(E->getArg(1));
12711 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
12712 Value *Val5 = EmitScalarExpr(E->getArg(0));
12713 return Builder.CreateSelect(Val2, Val4, Val5);
12714 }
12715 case ARM::BI__builtin_arm_mve_vbicq_m_n_s32:
12716 case ARM::BI__builtin_arm_mve_vbicq_m_n_u32: {
12717 bool Param0;
12718 switch (BuiltinID) {
12719 case ARM::BI__builtin_arm_mve_vbicq_m_n_s32:
12720 Param0 = true;
12721 break;
12722 case ARM::BI__builtin_arm_mve_vbicq_m_n_u32:
12723 Param0 = false;
12724 break;
12725 }
12726 Value *Val0 = EmitScalarExpr(E->getArg(2));
12727 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12728 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
12729 Value *Val3 = EmitScalarExpr(E->getArg(0));
12730 Value *Val4 = EmitScalarExpr(E->getArg(1));
12731 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, Param0);
12732 Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
12733 Value *Val7 = Builder.CreateNot(Val6);
12734 Value *Val8 = Builder.CreateAnd(Val3, Val7);
12735 return Builder.CreateSelect(Val2, Val8, Val3);
12736 }
12737 case ARM::BI__builtin_arm_mve_vorrq_m_n_s32:
12738 case ARM::BI__builtin_arm_mve_vorrq_m_n_u32: {
12739 bool Param0;
12740 switch (BuiltinID) {
12741 case ARM::BI__builtin_arm_mve_vorrq_m_n_s32:
12742 Param0 = true;
12743 break;
12744 case ARM::BI__builtin_arm_mve_vorrq_m_n_u32:
12745 Param0 = false;
12746 break;
12747 }
12748 Value *Val0 = EmitScalarExpr(E->getArg(2));
12749 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12750 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
12751 Value *Val3 = EmitScalarExpr(E->getArg(0));
12752 Value *Val4 = EmitScalarExpr(E->getArg(1));
12753 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, Param0);
12754 Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
12755 Value *Val7 = Builder.CreateOr(Val3, Val6);
12756 return Builder.CreateSelect(Val2, Val7, Val3);
12757 }
12758 case ARM::BI__builtin_arm_mve_vpselq_s64:
12759 case ARM::BI__builtin_arm_mve_vpselq_u64: {
12760 Value *Val0 = EmitScalarExpr(E->getArg(2));
12761 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12762 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
12763 Value *Val3 = EmitScalarExpr(E->getArg(0));
12764 llvm::Type *Val4 = llvm::FixedVectorType::get(Int32Ty, 4);
12765 Value *Val5 = Builder.CreateBitCast(Val3, Val4);
12766 Value *Val6 = EmitScalarExpr(E->getArg(1));
12767 llvm::Type *Val7 = llvm::FixedVectorType::get(Int32Ty, 4);
12768 Value *Val8 = Builder.CreateBitCast(Val6, Val7);
12769 Value *Val9 = Builder.CreateSelect(Val2, Val5, Val8);
12770 llvm::Type *Val10 = llvm::FixedVectorType::get(Int64Ty, 2);
12771 return Builder.CreateBitCast(Val9, Val10);
12772 }
12773 case ARM::BI__builtin_arm_mve_vmvnq_m_n_s32:
12774 case ARM::BI__builtin_arm_mve_vmvnq_m_n_u32: {
12775 bool Param0;
12776 switch (BuiltinID) {
12777 case ARM::BI__builtin_arm_mve_vmvnq_m_n_s32:
12778 Param0 = true;
12779 break;
12780 case ARM::BI__builtin_arm_mve_vmvnq_m_n_u32:
12781 Param0 = false;
12782 break;
12783 }
12784 Value *Val0 = EmitScalarExpr(E->getArg(2));
12785 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12786 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1});
12787 Value *Val3 = EmitScalarExpr(E->getArg(1));
12788 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, Param0);
12789 Value *Val5 = ARMMVEVectorSplat(Builder, Val4);
12790 Value *Val6 = Builder.CreateNot(Val5);
12791 Value *Val7 = EmitScalarExpr(E->getArg(0));
12792 return Builder.CreateSelect(Val2, Val6, Val7);
12793 }
12794 case ARM::BI__builtin_arm_mve_vbicq_m_n_s16:
12795 case ARM::BI__builtin_arm_mve_vbicq_m_n_u16: {
12796 bool Param0;
12797 switch (BuiltinID) {
12798 case ARM::BI__builtin_arm_mve_vbicq_m_n_s16:
12799 Param0 = true;
12800 break;
12801 case ARM::BI__builtin_arm_mve_vbicq_m_n_u16:
12802 Param0 = false;
12803 break;
12804 }
12805 Value *Val0 = EmitScalarExpr(E->getArg(2));
12806 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12807 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1});
12808 Value *Val3 = EmitScalarExpr(E->getArg(0));
12809 Value *Val4 = EmitScalarExpr(E->getArg(1));
12810 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
12811 Value *Val6 = Builder.CreateIntCast(Val5, Int16Ty, Param0);
12812 Value *Val7 = ARMMVEVectorSplat(Builder, Val6);
12813 Value *Val8 = Builder.CreateNot(Val7);
12814 Value *Val9 = Builder.CreateAnd(Val3, Val8);
12815 return Builder.CreateSelect(Val2, Val9, Val3);
12816 }
12817 case ARM::BI__builtin_arm_mve_vorrq_m_n_s16:
12818 case ARM::BI__builtin_arm_mve_vorrq_m_n_u16: {
12819 bool Param0;
12820 switch (BuiltinID) {
12821 case ARM::BI__builtin_arm_mve_vorrq_m_n_s16:
12822 Param0 = true;
12823 break;
12824 case ARM::BI__builtin_arm_mve_vorrq_m_n_u16:
12825 Param0 = false;
12826 break;
12827 }
12828 Value *Val0 = EmitScalarExpr(E->getArg(2));
12829 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12830 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1});
12831 Value *Val3 = EmitScalarExpr(E->getArg(0));
12832 Value *Val4 = EmitScalarExpr(E->getArg(1));
12833 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
12834 Value *Val6 = Builder.CreateIntCast(Val5, Int16Ty, Param0);
12835 Value *Val7 = ARMMVEVectorSplat(Builder, Val6);
12836 Value *Val8 = Builder.CreateOr(Val3, Val7);
12837 return Builder.CreateSelect(Val2, Val8, Val3);
12838 }
12839 case ARM::BI__builtin_arm_mve_vmvnq_m_n_s16:
12840 case ARM::BI__builtin_arm_mve_vmvnq_m_n_u16: {
12841 bool Param0;
12842 switch (BuiltinID) {
12843 case ARM::BI__builtin_arm_mve_vmvnq_m_n_s16:
12844 Param0 = true;
12845 break;
12846 case ARM::BI__builtin_arm_mve_vmvnq_m_n_u16:
12847 Param0 = false;
12848 break;
12849 }
12850 Value *Val0 = EmitScalarExpr(E->getArg(2));
12851 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12852 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1});
12853 Value *Val3 = EmitScalarExpr(E->getArg(1));
12854 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
12855 Value *Val5 = Builder.CreateIntCast(Val4, Int16Ty, Param0);
12856 Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
12857 Value *Val7 = Builder.CreateNot(Val6);
12858 Value *Val8 = EmitScalarExpr(E->getArg(0));
12859 return Builder.CreateSelect(Val2, Val7, Val8);
12860 }
12861 case ARM::BI__builtin_arm_mve_vfmasq_m_n_f16:
12862 case ARM::BI__builtin_arm_mve_vfmasq_m_n_f32: {
12863 llvm::Type * Param0;
12864 llvm::Type * Param1;
12865 switch (BuiltinID) {
12866 case ARM::BI__builtin_arm_mve_vfmasq_m_n_f16:
12867 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12868 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
12869 break;
12870 case ARM::BI__builtin_arm_mve_vfmasq_m_n_f32:
12871 Param0 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12872 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
12873 break;
12874 }
12875 Value *Val0 = EmitScalarExpr(E->getArg(3));
12876 Value *Val1 = Builder.CreateIntCast(Val0, Int32Ty, false);
12877 Value *Val2 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param0}), {Val1});
12878 Value *Val3 = EmitScalarExpr(E->getArg(2));
12879 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
12880 Value *Val5 = EmitScalarExpr(E->getArg(0));
12881 Value *Val6 = EmitScalarExpr(E->getArg(1));
12882 Value *Val7 = (Val6);
12883 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::fma, {Param1}), {Val5, Val7, Val4});
12884 return Builder.CreateSelect(Val2, Val8, Val5);
12885 }
12886 case ARM::BI__builtin_arm_mve_vcvtaq_m_s16_f16:
12887 case ARM::BI__builtin_arm_mve_vcvtaq_m_s32_f32:
12888 case ARM::BI__builtin_arm_mve_vcvtaq_m_u16_f16:
12889 case ARM::BI__builtin_arm_mve_vcvtaq_m_u32_f32:
12890 case ARM::BI__builtin_arm_mve_vcvtmq_m_s16_f16:
12891 case ARM::BI__builtin_arm_mve_vcvtmq_m_s32_f32:
12892 case ARM::BI__builtin_arm_mve_vcvtmq_m_u16_f16:
12893 case ARM::BI__builtin_arm_mve_vcvtmq_m_u32_f32:
12894 case ARM::BI__builtin_arm_mve_vcvtnq_m_s16_f16:
12895 case ARM::BI__builtin_arm_mve_vcvtnq_m_s32_f32:
12896 case ARM::BI__builtin_arm_mve_vcvtnq_m_u16_f16:
12897 case ARM::BI__builtin_arm_mve_vcvtnq_m_u32_f32:
12898 case ARM::BI__builtin_arm_mve_vcvtpq_m_s16_f16:
12899 case ARM::BI__builtin_arm_mve_vcvtpq_m_s32_f32:
12900 case ARM::BI__builtin_arm_mve_vcvtpq_m_u16_f16:
12901 case ARM::BI__builtin_arm_mve_vcvtpq_m_u32_f32: {
12902 uint32_t Param0;
12903 llvm::Type * Param1;
12904 Intrinsic::ID Param2;
12905 llvm::Type * Param3;
12906 llvm::Type * Param4;
12907 switch (BuiltinID) {
12908 case ARM::BI__builtin_arm_mve_vcvtaq_m_s16_f16:
12909 Param0 = 0;
12910 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12911 Param2 = Intrinsic::arm_mve_vcvta_predicated;
12912 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12913 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12914 break;
12915 case ARM::BI__builtin_arm_mve_vcvtaq_m_s32_f32:
12916 Param0 = 0;
12917 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12918 Param2 = Intrinsic::arm_mve_vcvta_predicated;
12919 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12920 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12921 break;
12922 case ARM::BI__builtin_arm_mve_vcvtaq_m_u16_f16:
12923 Param0 = 1;
12924 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12925 Param2 = Intrinsic::arm_mve_vcvta_predicated;
12926 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12927 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12928 break;
12929 case ARM::BI__builtin_arm_mve_vcvtaq_m_u32_f32:
12930 Param0 = 1;
12931 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12932 Param2 = Intrinsic::arm_mve_vcvta_predicated;
12933 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12934 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12935 break;
12936 case ARM::BI__builtin_arm_mve_vcvtmq_m_s16_f16:
12937 Param0 = 0;
12938 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12939 Param2 = Intrinsic::arm_mve_vcvtm_predicated;
12940 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12941 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12942 break;
12943 case ARM::BI__builtin_arm_mve_vcvtmq_m_s32_f32:
12944 Param0 = 0;
12945 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12946 Param2 = Intrinsic::arm_mve_vcvtm_predicated;
12947 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12948 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12949 break;
12950 case ARM::BI__builtin_arm_mve_vcvtmq_m_u16_f16:
12951 Param0 = 1;
12952 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12953 Param2 = Intrinsic::arm_mve_vcvtm_predicated;
12954 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12955 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12956 break;
12957 case ARM::BI__builtin_arm_mve_vcvtmq_m_u32_f32:
12958 Param0 = 1;
12959 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12960 Param2 = Intrinsic::arm_mve_vcvtm_predicated;
12961 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12962 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12963 break;
12964 case ARM::BI__builtin_arm_mve_vcvtnq_m_s16_f16:
12965 Param0 = 0;
12966 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12967 Param2 = Intrinsic::arm_mve_vcvtn_predicated;
12968 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12969 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12970 break;
12971 case ARM::BI__builtin_arm_mve_vcvtnq_m_s32_f32:
12972 Param0 = 0;
12973 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12974 Param2 = Intrinsic::arm_mve_vcvtn_predicated;
12975 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12976 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12977 break;
12978 case ARM::BI__builtin_arm_mve_vcvtnq_m_u16_f16:
12979 Param0 = 1;
12980 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12981 Param2 = Intrinsic::arm_mve_vcvtn_predicated;
12982 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12983 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12984 break;
12985 case ARM::BI__builtin_arm_mve_vcvtnq_m_u32_f32:
12986 Param0 = 1;
12987 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
12988 Param2 = Intrinsic::arm_mve_vcvtn_predicated;
12989 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
12990 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
12991 break;
12992 case ARM::BI__builtin_arm_mve_vcvtpq_m_s16_f16:
12993 Param0 = 0;
12994 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
12995 Param2 = Intrinsic::arm_mve_vcvtp_predicated;
12996 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
12997 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
12998 break;
12999 case ARM::BI__builtin_arm_mve_vcvtpq_m_s32_f32:
13000 Param0 = 0;
13001 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13002 Param2 = Intrinsic::arm_mve_vcvtp_predicated;
13003 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13004 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
13005 break;
13006 case ARM::BI__builtin_arm_mve_vcvtpq_m_u16_f16:
13007 Param0 = 1;
13008 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13009 Param2 = Intrinsic::arm_mve_vcvtp_predicated;
13010 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13011 Param4 = llvm::FixedVectorType::get(HalfTy, 8);
13012 break;
13013 case ARM::BI__builtin_arm_mve_vcvtpq_m_u32_f32:
13014 Param0 = 1;
13015 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13016 Param2 = Intrinsic::arm_mve_vcvtp_predicated;
13017 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13018 Param4 = llvm::FixedVectorType::get(FloatTy, 4);
13019 break;
13020 }
13021 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13022 Value *Val1 = EmitScalarExpr(E->getArg(0));
13023 Value *Val2 = EmitScalarExpr(E->getArg(1));
13024 Value *Val3 = EmitScalarExpr(E->getArg(2));
13025 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
13026 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val4});
13027 return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param4, Param1}), {Val0, Val1, Val2, Val5});
13028 }
13029 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_s16:
13030 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_u16:
13031 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_s32:
13032 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_u32:
13033 case ARM::BI__builtin_arm_mve_vcvtq_m_n_s16_f16:
13034 case ARM::BI__builtin_arm_mve_vcvtq_m_n_s32_f32:
13035 case ARM::BI__builtin_arm_mve_vcvtq_m_n_u16_f16:
13036 case ARM::BI__builtin_arm_mve_vcvtq_m_n_u32_f32: {
13037 uint32_t Param0;
13038 llvm::Type * Param1;
13039 llvm::Type * Param2;
13040 llvm::Type * Param3;
13041 switch (BuiltinID) {
13042 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_s16:
13043 Param0 = 0;
13044 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13045 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13046 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13047 break;
13048 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f16_u16:
13049 Param0 = 1;
13050 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13051 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13052 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13053 break;
13054 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_s32:
13055 Param0 = 0;
13056 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13057 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13058 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13059 break;
13060 case ARM::BI__builtin_arm_mve_vcvtq_m_n_f32_u32:
13061 Param0 = 1;
13062 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13063 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13064 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13065 break;
13066 case ARM::BI__builtin_arm_mve_vcvtq_m_n_s16_f16:
13067 Param0 = 0;
13068 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13069 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13070 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13071 break;
13072 case ARM::BI__builtin_arm_mve_vcvtq_m_n_s32_f32:
13073 Param0 = 0;
13074 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13075 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13076 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13077 break;
13078 case ARM::BI__builtin_arm_mve_vcvtq_m_n_u16_f16:
13079 Param0 = 1;
13080 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13081 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13082 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13083 break;
13084 case ARM::BI__builtin_arm_mve_vcvtq_m_n_u32_f32:
13085 Param0 = 1;
13086 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13087 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13088 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13089 break;
13090 }
13091 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13092 Value *Val1 = EmitScalarExpr(E->getArg(0));
13093 Value *Val2 = EmitScalarExpr(E->getArg(1));
13094 Value *Val3 = EmitScalarExpr(E->getArg(2));
13095 Value *Val4 = EmitScalarExpr(E->getArg(3));
13096 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
13097 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
13098 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {Param2, Param3, Param1}), {Val0, Val1, Val2, Val3, Val6});
13099 }
13100 case ARM::BI__builtin_arm_mve_vabavq_p_s16:
13101 case ARM::BI__builtin_arm_mve_vabavq_p_s32:
13102 case ARM::BI__builtin_arm_mve_vabavq_p_s8:
13103 case ARM::BI__builtin_arm_mve_vabavq_p_u16:
13104 case ARM::BI__builtin_arm_mve_vabavq_p_u32:
13105 case ARM::BI__builtin_arm_mve_vabavq_p_u8:
13106 case ARM::BI__builtin_arm_mve_vcmlaq_m_f16:
13107 case ARM::BI__builtin_arm_mve_vcmlaq_m_f32:
13108 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f16:
13109 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f32:
13110 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f16:
13111 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f32:
13112 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f16:
13113 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f32:
13114 case ARM::BI__builtin_arm_mve_vcmulq_m_f16:
13115 case ARM::BI__builtin_arm_mve_vcmulq_m_f32:
13116 case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f16:
13117 case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f32:
13118 case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f16:
13119 case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f32:
13120 case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f16:
13121 case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f32: {
13122 uint32_t Param0;
13123 llvm::Type * Param1;
13124 Intrinsic::ID Param2;
13125 llvm::Type * Param3;
13126 switch (BuiltinID) {
13127 case ARM::BI__builtin_arm_mve_vabavq_p_s16:
13128 Param0 = 0;
13129 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13130 Param2 = Intrinsic::arm_mve_vabav_predicated;
13131 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13132 break;
13133 case ARM::BI__builtin_arm_mve_vabavq_p_s32:
13134 Param0 = 0;
13135 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13136 Param2 = Intrinsic::arm_mve_vabav_predicated;
13137 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13138 break;
13139 case ARM::BI__builtin_arm_mve_vabavq_p_s8:
13140 Param0 = 0;
13141 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13142 Param2 = Intrinsic::arm_mve_vabav_predicated;
13143 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13144 break;
13145 case ARM::BI__builtin_arm_mve_vabavq_p_u16:
13146 Param0 = 1;
13147 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13148 Param2 = Intrinsic::arm_mve_vabav_predicated;
13149 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13150 break;
13151 case ARM::BI__builtin_arm_mve_vabavq_p_u32:
13152 Param0 = 1;
13153 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13154 Param2 = Intrinsic::arm_mve_vabav_predicated;
13155 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13156 break;
13157 case ARM::BI__builtin_arm_mve_vabavq_p_u8:
13158 Param0 = 1;
13159 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13160 Param2 = Intrinsic::arm_mve_vabav_predicated;
13161 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13162 break;
13163 case ARM::BI__builtin_arm_mve_vcmlaq_m_f16:
13164 Param0 = 0;
13165 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13166 Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13167 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13168 break;
13169 case ARM::BI__builtin_arm_mve_vcmlaq_m_f32:
13170 Param0 = 0;
13171 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13172 Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13173 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13174 break;
13175 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f16:
13176 Param0 = 2;
13177 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13178 Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13179 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13180 break;
13181 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_m_f32:
13182 Param0 = 2;
13183 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13184 Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13185 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13186 break;
13187 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f16:
13188 Param0 = 3;
13189 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13190 Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13191 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13192 break;
13193 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_m_f32:
13194 Param0 = 3;
13195 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13196 Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13197 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13198 break;
13199 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f16:
13200 Param0 = 1;
13201 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13202 Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13203 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13204 break;
13205 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_m_f32:
13206 Param0 = 1;
13207 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13208 Param2 = Intrinsic::arm_mve_vcmlaq_predicated;
13209 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13210 break;
13211 case ARM::BI__builtin_arm_mve_vcmulq_m_f16:
13212 Param0 = 0;
13213 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13214 Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13215 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13216 break;
13217 case ARM::BI__builtin_arm_mve_vcmulq_m_f32:
13218 Param0 = 0;
13219 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13220 Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13221 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13222 break;
13223 case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f16:
13224 Param0 = 2;
13225 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13226 Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13227 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13228 break;
13229 case ARM::BI__builtin_arm_mve_vcmulq_rot180_m_f32:
13230 Param0 = 2;
13231 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13232 Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13233 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13234 break;
13235 case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f16:
13236 Param0 = 3;
13237 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13238 Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13239 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13240 break;
13241 case ARM::BI__builtin_arm_mve_vcmulq_rot270_m_f32:
13242 Param0 = 3;
13243 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13244 Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13245 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13246 break;
13247 case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f16:
13248 Param0 = 1;
13249 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13250 Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13251 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13252 break;
13253 case ARM::BI__builtin_arm_mve_vcmulq_rot90_m_f32:
13254 Param0 = 1;
13255 Param1 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13256 Param2 = Intrinsic::arm_mve_vcmulq_predicated;
13257 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13258 break;
13259 }
13260 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13261 Value *Val1 = EmitScalarExpr(E->getArg(0));
13262 Value *Val2 = EmitScalarExpr(E->getArg(1));
13263 Value *Val3 = EmitScalarExpr(E->getArg(2));
13264 Value *Val4 = EmitScalarExpr(E->getArg(3));
13265 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
13266 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param1}), {Val5});
13267 return Builder.CreateCall(CGM.getIntrinsic(Param2, {Param3, Param1}), {Val0, Val1, Val2, Val3, Val6});
13268 }
13269 case ARM::BI__builtin_arm_mve_vabavq_s16:
13270 case ARM::BI__builtin_arm_mve_vabavq_s32:
13271 case ARM::BI__builtin_arm_mve_vabavq_s8:
13272 case ARM::BI__builtin_arm_mve_vabavq_u16:
13273 case ARM::BI__builtin_arm_mve_vabavq_u32:
13274 case ARM::BI__builtin_arm_mve_vabavq_u8:
13275 case ARM::BI__builtin_arm_mve_vcmlaq_f16:
13276 case ARM::BI__builtin_arm_mve_vcmlaq_f32:
13277 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f16:
13278 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f32:
13279 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f16:
13280 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f32:
13281 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f16:
13282 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f32: {
13283 uint32_t Param0;
13284 Intrinsic::ID Param1;
13285 llvm::Type * Param2;
13286 switch (BuiltinID) {
13287 case ARM::BI__builtin_arm_mve_vabavq_s16:
13288 Param0 = 0;
13289 Param1 = Intrinsic::arm_mve_vabav;
13290 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13291 break;
13292 case ARM::BI__builtin_arm_mve_vabavq_s32:
13293 Param0 = 0;
13294 Param1 = Intrinsic::arm_mve_vabav;
13295 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13296 break;
13297 case ARM::BI__builtin_arm_mve_vabavq_s8:
13298 Param0 = 0;
13299 Param1 = Intrinsic::arm_mve_vabav;
13300 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13301 break;
13302 case ARM::BI__builtin_arm_mve_vabavq_u16:
13303 Param0 = 1;
13304 Param1 = Intrinsic::arm_mve_vabav;
13305 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13306 break;
13307 case ARM::BI__builtin_arm_mve_vabavq_u32:
13308 Param0 = 1;
13309 Param1 = Intrinsic::arm_mve_vabav;
13310 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13311 break;
13312 case ARM::BI__builtin_arm_mve_vabavq_u8:
13313 Param0 = 1;
13314 Param1 = Intrinsic::arm_mve_vabav;
13315 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13316 break;
13317 case ARM::BI__builtin_arm_mve_vcmlaq_f16:
13318 Param0 = 0;
13319 Param1 = Intrinsic::arm_mve_vcmlaq;
13320 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13321 break;
13322 case ARM::BI__builtin_arm_mve_vcmlaq_f32:
13323 Param0 = 0;
13324 Param1 = Intrinsic::arm_mve_vcmlaq;
13325 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13326 break;
13327 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f16:
13328 Param0 = 2;
13329 Param1 = Intrinsic::arm_mve_vcmlaq;
13330 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13331 break;
13332 case ARM::BI__builtin_arm_mve_vcmlaq_rot180_f32:
13333 Param0 = 2;
13334 Param1 = Intrinsic::arm_mve_vcmlaq;
13335 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13336 break;
13337 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f16:
13338 Param0 = 3;
13339 Param1 = Intrinsic::arm_mve_vcmlaq;
13340 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13341 break;
13342 case ARM::BI__builtin_arm_mve_vcmlaq_rot270_f32:
13343 Param0 = 3;
13344 Param1 = Intrinsic::arm_mve_vcmlaq;
13345 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13346 break;
13347 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f16:
13348 Param0 = 1;
13349 Param1 = Intrinsic::arm_mve_vcmlaq;
13350 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13351 break;
13352 case ARM::BI__builtin_arm_mve_vcmlaq_rot90_f32:
13353 Param0 = 1;
13354 Param1 = Intrinsic::arm_mve_vcmlaq;
13355 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13356 break;
13357 }
13358 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13359 Value *Val1 = EmitScalarExpr(E->getArg(0));
13360 Value *Val2 = EmitScalarExpr(E->getArg(1));
13361 Value *Val3 = EmitScalarExpr(E->getArg(2));
13362 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2}), {Val0, Val1, Val2, Val3});
13363 }
13364 case ARM::BI__builtin_arm_mve_vcmulq_f16:
13365 case ARM::BI__builtin_arm_mve_vcmulq_f32:
13366 case ARM::BI__builtin_arm_mve_vcmulq_rot180_f16:
13367 case ARM::BI__builtin_arm_mve_vcmulq_rot180_f32:
13368 case ARM::BI__builtin_arm_mve_vcmulq_rot270_f16:
13369 case ARM::BI__builtin_arm_mve_vcmulq_rot270_f32:
13370 case ARM::BI__builtin_arm_mve_vcmulq_rot90_f16:
13371 case ARM::BI__builtin_arm_mve_vcmulq_rot90_f32: {
13372 uint32_t Param0;
13373 llvm::Type * Param1;
13374 switch (BuiltinID) {
13375 case ARM::BI__builtin_arm_mve_vcmulq_f16:
13376 Param0 = 0;
13377 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13378 break;
13379 case ARM::BI__builtin_arm_mve_vcmulq_f32:
13380 Param0 = 0;
13381 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13382 break;
13383 case ARM::BI__builtin_arm_mve_vcmulq_rot180_f16:
13384 Param0 = 2;
13385 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13386 break;
13387 case ARM::BI__builtin_arm_mve_vcmulq_rot180_f32:
13388 Param0 = 2;
13389 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13390 break;
13391 case ARM::BI__builtin_arm_mve_vcmulq_rot270_f16:
13392 Param0 = 3;
13393 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13394 break;
13395 case ARM::BI__builtin_arm_mve_vcmulq_rot270_f32:
13396 Param0 = 3;
13397 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13398 break;
13399 case ARM::BI__builtin_arm_mve_vcmulq_rot90_f16:
13400 Param0 = 1;
13401 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13402 break;
13403 case ARM::BI__builtin_arm_mve_vcmulq_rot90_f32:
13404 Param0 = 1;
13405 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13406 break;
13407 }
13408 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13409 Value *Val1 = EmitScalarExpr(E->getArg(0));
13410 Value *Val2 = EmitScalarExpr(E->getArg(1));
13411 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcmulq, {Param1}), {Val0, Val1, Val2});
13412 }
13413 case ARM::BI__builtin_arm_mve_vcvtq_n_f16_s16:
13414 case ARM::BI__builtin_arm_mve_vcvtq_n_f16_u16:
13415 case ARM::BI__builtin_arm_mve_vcvtq_n_f32_s32:
13416 case ARM::BI__builtin_arm_mve_vcvtq_n_f32_u32:
13417 case ARM::BI__builtin_arm_mve_vcvtq_n_s16_f16:
13418 case ARM::BI__builtin_arm_mve_vcvtq_n_s32_f32:
13419 case ARM::BI__builtin_arm_mve_vcvtq_n_u16_f16:
13420 case ARM::BI__builtin_arm_mve_vcvtq_n_u32_f32: {
13421 uint32_t Param0;
13422 llvm::Type * Param1;
13423 llvm::Type * Param2;
13424 switch (BuiltinID) {
13425 case ARM::BI__builtin_arm_mve_vcvtq_n_f16_s16:
13426 Param0 = 0;
13427 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13428 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13429 break;
13430 case ARM::BI__builtin_arm_mve_vcvtq_n_f16_u16:
13431 Param0 = 1;
13432 Param1 = llvm::FixedVectorType::get(HalfTy, 8);
13433 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13434 break;
13435 case ARM::BI__builtin_arm_mve_vcvtq_n_f32_s32:
13436 Param0 = 0;
13437 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13438 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13439 break;
13440 case ARM::BI__builtin_arm_mve_vcvtq_n_f32_u32:
13441 Param0 = 1;
13442 Param1 = llvm::FixedVectorType::get(FloatTy, 4);
13443 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13444 break;
13445 case ARM::BI__builtin_arm_mve_vcvtq_n_s16_f16:
13446 Param0 = 0;
13447 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
13448 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13449 break;
13450 case ARM::BI__builtin_arm_mve_vcvtq_n_s32_f32:
13451 Param0 = 0;
13452 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
13453 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13454 break;
13455 case ARM::BI__builtin_arm_mve_vcvtq_n_u16_f16:
13456 Param0 = 1;
13457 Param1 = llvm::FixedVectorType::get(Int16Ty, 8);
13458 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13459 break;
13460 case ARM::BI__builtin_arm_mve_vcvtq_n_u32_f32:
13461 Param0 = 1;
13462 Param1 = llvm::FixedVectorType::get(Int32Ty, 4);
13463 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13464 break;
13465 }
13466 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13467 Value *Val1 = EmitScalarExpr(E->getArg(0));
13468 Value *Val2 = EmitScalarExpr(E->getArg(1));
13469 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix, {Param1, Param2}), {Val0, Val1, Val2});
13470 }
13471 case ARM::BI__builtin_arm_mve_vcvtaq_s16_f16:
13472 case ARM::BI__builtin_arm_mve_vcvtaq_s32_f32:
13473 case ARM::BI__builtin_arm_mve_vcvtaq_u16_f16:
13474 case ARM::BI__builtin_arm_mve_vcvtaq_u32_f32:
13475 case ARM::BI__builtin_arm_mve_vcvtmq_s16_f16:
13476 case ARM::BI__builtin_arm_mve_vcvtmq_s32_f32:
13477 case ARM::BI__builtin_arm_mve_vcvtmq_u16_f16:
13478 case ARM::BI__builtin_arm_mve_vcvtmq_u32_f32:
13479 case ARM::BI__builtin_arm_mve_vcvtnq_s16_f16:
13480 case ARM::BI__builtin_arm_mve_vcvtnq_s32_f32:
13481 case ARM::BI__builtin_arm_mve_vcvtnq_u16_f16:
13482 case ARM::BI__builtin_arm_mve_vcvtnq_u32_f32:
13483 case ARM::BI__builtin_arm_mve_vcvtpq_s16_f16:
13484 case ARM::BI__builtin_arm_mve_vcvtpq_s32_f32:
13485 case ARM::BI__builtin_arm_mve_vcvtpq_u16_f16:
13486 case ARM::BI__builtin_arm_mve_vcvtpq_u32_f32: {
13487 uint32_t Param0;
13488 Intrinsic::ID Param1;
13489 llvm::Type * Param2;
13490 llvm::Type * Param3;
13491 switch (BuiltinID) {
13492 case ARM::BI__builtin_arm_mve_vcvtaq_s16_f16:
13493 Param0 = 0;
13494 Param1 = Intrinsic::arm_mve_vcvta;
13495 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13496 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13497 break;
13498 case ARM::BI__builtin_arm_mve_vcvtaq_s32_f32:
13499 Param0 = 0;
13500 Param1 = Intrinsic::arm_mve_vcvta;
13501 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13502 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13503 break;
13504 case ARM::BI__builtin_arm_mve_vcvtaq_u16_f16:
13505 Param0 = 1;
13506 Param1 = Intrinsic::arm_mve_vcvta;
13507 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13508 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13509 break;
13510 case ARM::BI__builtin_arm_mve_vcvtaq_u32_f32:
13511 Param0 = 1;
13512 Param1 = Intrinsic::arm_mve_vcvta;
13513 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13514 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13515 break;
13516 case ARM::BI__builtin_arm_mve_vcvtmq_s16_f16:
13517 Param0 = 0;
13518 Param1 = Intrinsic::arm_mve_vcvtm;
13519 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13520 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13521 break;
13522 case ARM::BI__builtin_arm_mve_vcvtmq_s32_f32:
13523 Param0 = 0;
13524 Param1 = Intrinsic::arm_mve_vcvtm;
13525 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13526 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13527 break;
13528 case ARM::BI__builtin_arm_mve_vcvtmq_u16_f16:
13529 Param0 = 1;
13530 Param1 = Intrinsic::arm_mve_vcvtm;
13531 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13532 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13533 break;
13534 case ARM::BI__builtin_arm_mve_vcvtmq_u32_f32:
13535 Param0 = 1;
13536 Param1 = Intrinsic::arm_mve_vcvtm;
13537 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13538 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13539 break;
13540 case ARM::BI__builtin_arm_mve_vcvtnq_s16_f16:
13541 Param0 = 0;
13542 Param1 = Intrinsic::arm_mve_vcvtn;
13543 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13544 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13545 break;
13546 case ARM::BI__builtin_arm_mve_vcvtnq_s32_f32:
13547 Param0 = 0;
13548 Param1 = Intrinsic::arm_mve_vcvtn;
13549 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13550 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13551 break;
13552 case ARM::BI__builtin_arm_mve_vcvtnq_u16_f16:
13553 Param0 = 1;
13554 Param1 = Intrinsic::arm_mve_vcvtn;
13555 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13556 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13557 break;
13558 case ARM::BI__builtin_arm_mve_vcvtnq_u32_f32:
13559 Param0 = 1;
13560 Param1 = Intrinsic::arm_mve_vcvtn;
13561 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13562 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13563 break;
13564 case ARM::BI__builtin_arm_mve_vcvtpq_s16_f16:
13565 Param0 = 0;
13566 Param1 = Intrinsic::arm_mve_vcvtp;
13567 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13568 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13569 break;
13570 case ARM::BI__builtin_arm_mve_vcvtpq_s32_f32:
13571 Param0 = 0;
13572 Param1 = Intrinsic::arm_mve_vcvtp;
13573 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13574 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13575 break;
13576 case ARM::BI__builtin_arm_mve_vcvtpq_u16_f16:
13577 Param0 = 1;
13578 Param1 = Intrinsic::arm_mve_vcvtp;
13579 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13580 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13581 break;
13582 case ARM::BI__builtin_arm_mve_vcvtpq_u32_f32:
13583 Param0 = 1;
13584 Param1 = Intrinsic::arm_mve_vcvtp;
13585 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13586 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13587 break;
13588 }
13589 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13590 Value *Val1 = EmitScalarExpr(E->getArg(0));
13591 return Builder.CreateCall(CGM.getIntrinsic(Param1, {Param2, Param3}), {Val0, Val1});
13592 }
13593 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f16:
13594 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f32:
13595 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s16:
13596 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s32:
13597 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s8:
13598 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u16:
13599 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u32:
13600 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u8:
13601 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f16:
13602 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f32:
13603 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s16:
13604 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s32:
13605 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s8:
13606 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u16:
13607 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u32:
13608 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u8:
13609 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s16:
13610 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s32:
13611 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s8:
13612 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s16:
13613 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s32:
13614 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s8: {
13615 uint32_t Param0;
13616 uint32_t Param1;
13617 llvm::Type * Param2;
13618 llvm::Type * Param3;
13619 switch (BuiltinID) {
13620 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f16:
13621 Param0 = 1;
13622 Param1 = 1;
13623 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13624 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13625 break;
13626 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_f32:
13627 Param0 = 1;
13628 Param1 = 1;
13629 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13630 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13631 break;
13632 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s16:
13633 Param0 = 1;
13634 Param1 = 1;
13635 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13636 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13637 break;
13638 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s32:
13639 Param0 = 1;
13640 Param1 = 1;
13641 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13642 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13643 break;
13644 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_s8:
13645 Param0 = 1;
13646 Param1 = 1;
13647 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13648 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13649 break;
13650 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u16:
13651 Param0 = 1;
13652 Param1 = 1;
13653 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13654 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13655 break;
13656 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u32:
13657 Param0 = 1;
13658 Param1 = 1;
13659 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13660 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13661 break;
13662 case ARM::BI__builtin_arm_mve_vcaddq_rot270_m_u8:
13663 Param0 = 1;
13664 Param1 = 1;
13665 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13666 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13667 break;
13668 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f16:
13669 Param0 = 1;
13670 Param1 = 0;
13671 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13672 Param3 = llvm::FixedVectorType::get(HalfTy, 8);
13673 break;
13674 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_f32:
13675 Param0 = 1;
13676 Param1 = 0;
13677 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13678 Param3 = llvm::FixedVectorType::get(FloatTy, 4);
13679 break;
13680 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s16:
13681 Param0 = 1;
13682 Param1 = 0;
13683 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13684 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13685 break;
13686 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s32:
13687 Param0 = 1;
13688 Param1 = 0;
13689 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13690 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13691 break;
13692 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_s8:
13693 Param0 = 1;
13694 Param1 = 0;
13695 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13696 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13697 break;
13698 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u16:
13699 Param0 = 1;
13700 Param1 = 0;
13701 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13702 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13703 break;
13704 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u32:
13705 Param0 = 1;
13706 Param1 = 0;
13707 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13708 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13709 break;
13710 case ARM::BI__builtin_arm_mve_vcaddq_rot90_m_u8:
13711 Param0 = 1;
13712 Param1 = 0;
13713 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13714 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13715 break;
13716 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s16:
13717 Param0 = 0;
13718 Param1 = 1;
13719 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13720 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13721 break;
13722 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s32:
13723 Param0 = 0;
13724 Param1 = 1;
13725 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13726 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13727 break;
13728 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_m_s8:
13729 Param0 = 0;
13730 Param1 = 1;
13731 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13732 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13733 break;
13734 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s16:
13735 Param0 = 0;
13736 Param1 = 0;
13737 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13738 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
13739 break;
13740 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s32:
13741 Param0 = 0;
13742 Param1 = 0;
13743 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13744 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
13745 break;
13746 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_m_s8:
13747 Param0 = 0;
13748 Param1 = 0;
13749 Param2 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13750 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
13751 break;
13752 }
13753 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13754 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
13755 Value *Val2 = EmitScalarExpr(E->getArg(0));
13756 Value *Val3 = EmitScalarExpr(E->getArg(1));
13757 Value *Val4 = EmitScalarExpr(E->getArg(2));
13758 Value *Val5 = EmitScalarExpr(E->getArg(3));
13759 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
13760 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param2}), {Val6});
13761 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {Param3, Param2}), {Val0, Val1, Val2, Val3, Val4, Val7});
13762 }
13763 case ARM::BI__builtin_arm_mve_vcaddq_rot270_f16:
13764 case ARM::BI__builtin_arm_mve_vcaddq_rot270_f32:
13765 case ARM::BI__builtin_arm_mve_vcaddq_rot270_s16:
13766 case ARM::BI__builtin_arm_mve_vcaddq_rot270_s32:
13767 case ARM::BI__builtin_arm_mve_vcaddq_rot270_s8:
13768 case ARM::BI__builtin_arm_mve_vcaddq_rot270_u16:
13769 case ARM::BI__builtin_arm_mve_vcaddq_rot270_u32:
13770 case ARM::BI__builtin_arm_mve_vcaddq_rot270_u8:
13771 case ARM::BI__builtin_arm_mve_vcaddq_rot90_f16:
13772 case ARM::BI__builtin_arm_mve_vcaddq_rot90_f32:
13773 case ARM::BI__builtin_arm_mve_vcaddq_rot90_s16:
13774 case ARM::BI__builtin_arm_mve_vcaddq_rot90_s32:
13775 case ARM::BI__builtin_arm_mve_vcaddq_rot90_s8:
13776 case ARM::BI__builtin_arm_mve_vcaddq_rot90_u16:
13777 case ARM::BI__builtin_arm_mve_vcaddq_rot90_u32:
13778 case ARM::BI__builtin_arm_mve_vcaddq_rot90_u8:
13779 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s16:
13780 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s32:
13781 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s8:
13782 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s16:
13783 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s32:
13784 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s8: {
13785 uint32_t Param0;
13786 uint32_t Param1;
13787 llvm::Type * Param2;
13788 switch (BuiltinID) {
13789 case ARM::BI__builtin_arm_mve_vcaddq_rot270_f16:
13790 Param0 = 1;
13791 Param1 = 1;
13792 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13793 break;
13794 case ARM::BI__builtin_arm_mve_vcaddq_rot270_f32:
13795 Param0 = 1;
13796 Param1 = 1;
13797 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13798 break;
13799 case ARM::BI__builtin_arm_mve_vcaddq_rot270_s16:
13800 Param0 = 1;
13801 Param1 = 1;
13802 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13803 break;
13804 case ARM::BI__builtin_arm_mve_vcaddq_rot270_s32:
13805 Param0 = 1;
13806 Param1 = 1;
13807 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13808 break;
13809 case ARM::BI__builtin_arm_mve_vcaddq_rot270_s8:
13810 Param0 = 1;
13811 Param1 = 1;
13812 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13813 break;
13814 case ARM::BI__builtin_arm_mve_vcaddq_rot270_u16:
13815 Param0 = 1;
13816 Param1 = 1;
13817 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13818 break;
13819 case ARM::BI__builtin_arm_mve_vcaddq_rot270_u32:
13820 Param0 = 1;
13821 Param1 = 1;
13822 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13823 break;
13824 case ARM::BI__builtin_arm_mve_vcaddq_rot270_u8:
13825 Param0 = 1;
13826 Param1 = 1;
13827 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13828 break;
13829 case ARM::BI__builtin_arm_mve_vcaddq_rot90_f16:
13830 Param0 = 1;
13831 Param1 = 0;
13832 Param2 = llvm::FixedVectorType::get(HalfTy, 8);
13833 break;
13834 case ARM::BI__builtin_arm_mve_vcaddq_rot90_f32:
13835 Param0 = 1;
13836 Param1 = 0;
13837 Param2 = llvm::FixedVectorType::get(FloatTy, 4);
13838 break;
13839 case ARM::BI__builtin_arm_mve_vcaddq_rot90_s16:
13840 Param0 = 1;
13841 Param1 = 0;
13842 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13843 break;
13844 case ARM::BI__builtin_arm_mve_vcaddq_rot90_s32:
13845 Param0 = 1;
13846 Param1 = 0;
13847 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13848 break;
13849 case ARM::BI__builtin_arm_mve_vcaddq_rot90_s8:
13850 Param0 = 1;
13851 Param1 = 0;
13852 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13853 break;
13854 case ARM::BI__builtin_arm_mve_vcaddq_rot90_u16:
13855 Param0 = 1;
13856 Param1 = 0;
13857 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13858 break;
13859 case ARM::BI__builtin_arm_mve_vcaddq_rot90_u32:
13860 Param0 = 1;
13861 Param1 = 0;
13862 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13863 break;
13864 case ARM::BI__builtin_arm_mve_vcaddq_rot90_u8:
13865 Param0 = 1;
13866 Param1 = 0;
13867 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13868 break;
13869 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s16:
13870 Param0 = 0;
13871 Param1 = 1;
13872 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13873 break;
13874 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s32:
13875 Param0 = 0;
13876 Param1 = 1;
13877 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13878 break;
13879 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_s8:
13880 Param0 = 0;
13881 Param1 = 1;
13882 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13883 break;
13884 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s16:
13885 Param0 = 0;
13886 Param1 = 0;
13887 Param2 = llvm::FixedVectorType::get(Int16Ty, 8);
13888 break;
13889 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s32:
13890 Param0 = 0;
13891 Param1 = 0;
13892 Param2 = llvm::FixedVectorType::get(Int32Ty, 4);
13893 break;
13894 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_s8:
13895 Param0 = 0;
13896 Param1 = 0;
13897 Param2 = llvm::FixedVectorType::get(Int8Ty, 16);
13898 break;
13899 }
13900 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
13901 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
13902 Value *Val2 = EmitScalarExpr(E->getArg(0));
13903 Value *Val3 = EmitScalarExpr(E->getArg(1));
13904 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq, {Param2}), {Val0, Val1, Val2, Val3});
13905 }
13906 case ARM::BI__builtin_arm_mve_vmladavaq_p_s16:
13907 case ARM::BI__builtin_arm_mve_vmladavaq_p_s32:
13908 case ARM::BI__builtin_arm_mve_vmladavaq_p_s8:
13909 case ARM::BI__builtin_arm_mve_vmladavaq_p_u16:
13910 case ARM::BI__builtin_arm_mve_vmladavaq_p_u32:
13911 case ARM::BI__builtin_arm_mve_vmladavaq_p_u8:
13912 case ARM::BI__builtin_arm_mve_vmladavaxq_p_s16:
13913 case ARM::BI__builtin_arm_mve_vmladavaxq_p_s32:
13914 case ARM::BI__builtin_arm_mve_vmladavaxq_p_s8:
13915 case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s16:
13916 case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s32:
13917 case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s8:
13918 case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s16:
13919 case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s32:
13920 case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s8: {
13921 uint32_t Param0;
13922 uint32_t Param1;
13923 uint32_t Param2;
13924 llvm::Type * Param3;
13925 llvm::Type * Param4;
13926 switch (BuiltinID) {
13927 case ARM::BI__builtin_arm_mve_vmladavaq_p_s16:
13928 Param0 = 0;
13929 Param1 = 0;
13930 Param2 = 0;
13931 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13932 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
13933 break;
13934 case ARM::BI__builtin_arm_mve_vmladavaq_p_s32:
13935 Param0 = 0;
13936 Param1 = 0;
13937 Param2 = 0;
13938 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13939 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
13940 break;
13941 case ARM::BI__builtin_arm_mve_vmladavaq_p_s8:
13942 Param0 = 0;
13943 Param1 = 0;
13944 Param2 = 0;
13945 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13946 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
13947 break;
13948 case ARM::BI__builtin_arm_mve_vmladavaq_p_u16:
13949 Param0 = 1;
13950 Param1 = 0;
13951 Param2 = 0;
13952 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13953 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
13954 break;
13955 case ARM::BI__builtin_arm_mve_vmladavaq_p_u32:
13956 Param0 = 1;
13957 Param1 = 0;
13958 Param2 = 0;
13959 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13960 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
13961 break;
13962 case ARM::BI__builtin_arm_mve_vmladavaq_p_u8:
13963 Param0 = 1;
13964 Param1 = 0;
13965 Param2 = 0;
13966 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13967 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
13968 break;
13969 case ARM::BI__builtin_arm_mve_vmladavaxq_p_s16:
13970 Param0 = 0;
13971 Param1 = 0;
13972 Param2 = 1;
13973 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13974 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
13975 break;
13976 case ARM::BI__builtin_arm_mve_vmladavaxq_p_s32:
13977 Param0 = 0;
13978 Param1 = 0;
13979 Param2 = 1;
13980 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
13981 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
13982 break;
13983 case ARM::BI__builtin_arm_mve_vmladavaxq_p_s8:
13984 Param0 = 0;
13985 Param1 = 0;
13986 Param2 = 1;
13987 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
13988 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
13989 break;
13990 case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s16:
13991 Param0 = 0;
13992 Param1 = 1;
13993 Param2 = 0;
13994 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
13995 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
13996 break;
13997 case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s32:
13998 Param0 = 0;
13999 Param1 = 1;
14000 Param2 = 0;
14001 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14002 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14003 break;
14004 case ARM::BI__builtin_arm_mve_vmlsdavaq_p_s8:
14005 Param0 = 0;
14006 Param1 = 1;
14007 Param2 = 0;
14008 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14009 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14010 break;
14011 case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s16:
14012 Param0 = 0;
14013 Param1 = 1;
14014 Param2 = 1;
14015 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14016 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14017 break;
14018 case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s32:
14019 Param0 = 0;
14020 Param1 = 1;
14021 Param2 = 1;
14022 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14023 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14024 break;
14025 case ARM::BI__builtin_arm_mve_vmlsdavaxq_p_s8:
14026 Param0 = 0;
14027 Param1 = 1;
14028 Param2 = 1;
14029 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14030 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14031 break;
14032 }
14033 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
14034 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
14035 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
14036 Value *Val3 = EmitScalarExpr(E->getArg(0));
14037 Value *Val4 = EmitScalarExpr(E->getArg(1));
14038 Value *Val5 = EmitScalarExpr(E->getArg(2));
14039 Value *Val6 = EmitScalarExpr(E->getArg(3));
14040 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
14041 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val7});
14042 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val3, Val4, Val5, Val8});
14043 }
14044 case ARM::BI__builtin_arm_mve_vmladavaq_s16:
14045 case ARM::BI__builtin_arm_mve_vmladavaq_s32:
14046 case ARM::BI__builtin_arm_mve_vmladavaq_s8:
14047 case ARM::BI__builtin_arm_mve_vmladavaq_u16:
14048 case ARM::BI__builtin_arm_mve_vmladavaq_u32:
14049 case ARM::BI__builtin_arm_mve_vmladavaq_u8:
14050 case ARM::BI__builtin_arm_mve_vmladavaxq_s16:
14051 case ARM::BI__builtin_arm_mve_vmladavaxq_s32:
14052 case ARM::BI__builtin_arm_mve_vmladavaxq_s8:
14053 case ARM::BI__builtin_arm_mve_vmlsdavaq_s16:
14054 case ARM::BI__builtin_arm_mve_vmlsdavaq_s32:
14055 case ARM::BI__builtin_arm_mve_vmlsdavaq_s8:
14056 case ARM::BI__builtin_arm_mve_vmlsdavaxq_s16:
14057 case ARM::BI__builtin_arm_mve_vmlsdavaxq_s32:
14058 case ARM::BI__builtin_arm_mve_vmlsdavaxq_s8: {
14059 uint32_t Param0;
14060 uint32_t Param1;
14061 uint32_t Param2;
14062 llvm::Type * Param3;
14063 switch (BuiltinID) {
14064 case ARM::BI__builtin_arm_mve_vmladavaq_s16:
14065 Param0 = 0;
14066 Param1 = 0;
14067 Param2 = 0;
14068 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14069 break;
14070 case ARM::BI__builtin_arm_mve_vmladavaq_s32:
14071 Param0 = 0;
14072 Param1 = 0;
14073 Param2 = 0;
14074 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14075 break;
14076 case ARM::BI__builtin_arm_mve_vmladavaq_s8:
14077 Param0 = 0;
14078 Param1 = 0;
14079 Param2 = 0;
14080 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14081 break;
14082 case ARM::BI__builtin_arm_mve_vmladavaq_u16:
14083 Param0 = 1;
14084 Param1 = 0;
14085 Param2 = 0;
14086 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14087 break;
14088 case ARM::BI__builtin_arm_mve_vmladavaq_u32:
14089 Param0 = 1;
14090 Param1 = 0;
14091 Param2 = 0;
14092 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14093 break;
14094 case ARM::BI__builtin_arm_mve_vmladavaq_u8:
14095 Param0 = 1;
14096 Param1 = 0;
14097 Param2 = 0;
14098 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14099 break;
14100 case ARM::BI__builtin_arm_mve_vmladavaxq_s16:
14101 Param0 = 0;
14102 Param1 = 0;
14103 Param2 = 1;
14104 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14105 break;
14106 case ARM::BI__builtin_arm_mve_vmladavaxq_s32:
14107 Param0 = 0;
14108 Param1 = 0;
14109 Param2 = 1;
14110 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14111 break;
14112 case ARM::BI__builtin_arm_mve_vmladavaxq_s8:
14113 Param0 = 0;
14114 Param1 = 0;
14115 Param2 = 1;
14116 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14117 break;
14118 case ARM::BI__builtin_arm_mve_vmlsdavaq_s16:
14119 Param0 = 0;
14120 Param1 = 1;
14121 Param2 = 0;
14122 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14123 break;
14124 case ARM::BI__builtin_arm_mve_vmlsdavaq_s32:
14125 Param0 = 0;
14126 Param1 = 1;
14127 Param2 = 0;
14128 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14129 break;
14130 case ARM::BI__builtin_arm_mve_vmlsdavaq_s8:
14131 Param0 = 0;
14132 Param1 = 1;
14133 Param2 = 0;
14134 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14135 break;
14136 case ARM::BI__builtin_arm_mve_vmlsdavaxq_s16:
14137 Param0 = 0;
14138 Param1 = 1;
14139 Param2 = 1;
14140 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14141 break;
14142 case ARM::BI__builtin_arm_mve_vmlsdavaxq_s32:
14143 Param0 = 0;
14144 Param1 = 1;
14145 Param2 = 1;
14146 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14147 break;
14148 case ARM::BI__builtin_arm_mve_vmlsdavaxq_s8:
14149 Param0 = 0;
14150 Param1 = 1;
14151 Param2 = 1;
14152 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14153 break;
14154 }
14155 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
14156 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
14157 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
14158 Value *Val3 = EmitScalarExpr(E->getArg(0));
14159 Value *Val4 = EmitScalarExpr(E->getArg(1));
14160 Value *Val5 = EmitScalarExpr(E->getArg(2));
14161 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava, {Param3}), {Val0, Val1, Val2, Val3, Val4, Val5});
14162 }
14163 case ARM::BI__builtin_arm_mve_vmladavq_p_s16:
14164 case ARM::BI__builtin_arm_mve_vmladavq_p_s32:
14165 case ARM::BI__builtin_arm_mve_vmladavq_p_s8:
14166 case ARM::BI__builtin_arm_mve_vmladavq_p_u16:
14167 case ARM::BI__builtin_arm_mve_vmladavq_p_u32:
14168 case ARM::BI__builtin_arm_mve_vmladavq_p_u8:
14169 case ARM::BI__builtin_arm_mve_vmladavxq_p_s16:
14170 case ARM::BI__builtin_arm_mve_vmladavxq_p_s32:
14171 case ARM::BI__builtin_arm_mve_vmladavxq_p_s8:
14172 case ARM::BI__builtin_arm_mve_vmlsdavq_p_s16:
14173 case ARM::BI__builtin_arm_mve_vmlsdavq_p_s32:
14174 case ARM::BI__builtin_arm_mve_vmlsdavq_p_s8:
14175 case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s16:
14176 case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s32:
14177 case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s8: {
14178 uint32_t Param0;
14179 uint32_t Param1;
14180 uint32_t Param2;
14181 llvm::Type * Param3;
14182 llvm::Type * Param4;
14183 switch (BuiltinID) {
14184 case ARM::BI__builtin_arm_mve_vmladavq_p_s16:
14185 Param0 = 0;
14186 Param1 = 0;
14187 Param2 = 0;
14188 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14189 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14190 break;
14191 case ARM::BI__builtin_arm_mve_vmladavq_p_s32:
14192 Param0 = 0;
14193 Param1 = 0;
14194 Param2 = 0;
14195 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14196 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14197 break;
14198 case ARM::BI__builtin_arm_mve_vmladavq_p_s8:
14199 Param0 = 0;
14200 Param1 = 0;
14201 Param2 = 0;
14202 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14203 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14204 break;
14205 case ARM::BI__builtin_arm_mve_vmladavq_p_u16:
14206 Param0 = 1;
14207 Param1 = 0;
14208 Param2 = 0;
14209 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14210 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14211 break;
14212 case ARM::BI__builtin_arm_mve_vmladavq_p_u32:
14213 Param0 = 1;
14214 Param1 = 0;
14215 Param2 = 0;
14216 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14217 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14218 break;
14219 case ARM::BI__builtin_arm_mve_vmladavq_p_u8:
14220 Param0 = 1;
14221 Param1 = 0;
14222 Param2 = 0;
14223 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14224 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14225 break;
14226 case ARM::BI__builtin_arm_mve_vmladavxq_p_s16:
14227 Param0 = 0;
14228 Param1 = 0;
14229 Param2 = 1;
14230 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14231 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14232 break;
14233 case ARM::BI__builtin_arm_mve_vmladavxq_p_s32:
14234 Param0 = 0;
14235 Param1 = 0;
14236 Param2 = 1;
14237 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14238 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14239 break;
14240 case ARM::BI__builtin_arm_mve_vmladavxq_p_s8:
14241 Param0 = 0;
14242 Param1 = 0;
14243 Param2 = 1;
14244 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14245 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14246 break;
14247 case ARM::BI__builtin_arm_mve_vmlsdavq_p_s16:
14248 Param0 = 0;
14249 Param1 = 1;
14250 Param2 = 0;
14251 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14252 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14253 break;
14254 case ARM::BI__builtin_arm_mve_vmlsdavq_p_s32:
14255 Param0 = 0;
14256 Param1 = 1;
14257 Param2 = 0;
14258 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14259 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14260 break;
14261 case ARM::BI__builtin_arm_mve_vmlsdavq_p_s8:
14262 Param0 = 0;
14263 Param1 = 1;
14264 Param2 = 0;
14265 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14266 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14267 break;
14268 case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s16:
14269 Param0 = 0;
14270 Param1 = 1;
14271 Param2 = 1;
14272 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14273 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14274 break;
14275 case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s32:
14276 Param0 = 0;
14277 Param1 = 1;
14278 Param2 = 1;
14279 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14280 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14281 break;
14282 case ARM::BI__builtin_arm_mve_vmlsdavxq_p_s8:
14283 Param0 = 0;
14284 Param1 = 1;
14285 Param2 = 1;
14286 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 16);
14287 Param4 = llvm::FixedVectorType::get(Int8Ty, 16);
14288 break;
14289 }
14290 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
14291 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
14292 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
14293 llvm::Type *Val3 = Int32Ty;
14294 Value *Val4 = llvm::Constant::getNullValue(Val3);
14295 Value *Val5 = EmitScalarExpr(E->getArg(0));
14296 Value *Val6 = EmitScalarExpr(E->getArg(1));
14297 Value *Val7 = EmitScalarExpr(E->getArg(2));
14298 Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
14299 Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val8});
14300 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava_predicated, {Param4, Param3}), {Val0, Val1, Val2, Val4, Val5, Val6, Val9});
14301 }
14302 case ARM::BI__builtin_arm_mve_vmladavq_s16:
14303 case ARM::BI__builtin_arm_mve_vmladavq_s32:
14304 case ARM::BI__builtin_arm_mve_vmladavq_s8:
14305 case ARM::BI__builtin_arm_mve_vmladavq_u16:
14306 case ARM::BI__builtin_arm_mve_vmladavq_u32:
14307 case ARM::BI__builtin_arm_mve_vmladavq_u8:
14308 case ARM::BI__builtin_arm_mve_vmladavxq_s16:
14309 case ARM::BI__builtin_arm_mve_vmladavxq_s32:
14310 case ARM::BI__builtin_arm_mve_vmladavxq_s8:
14311 case ARM::BI__builtin_arm_mve_vmlsdavq_s16:
14312 case ARM::BI__builtin_arm_mve_vmlsdavq_s32:
14313 case ARM::BI__builtin_arm_mve_vmlsdavq_s8:
14314 case ARM::BI__builtin_arm_mve_vmlsdavxq_s16:
14315 case ARM::BI__builtin_arm_mve_vmlsdavxq_s32:
14316 case ARM::BI__builtin_arm_mve_vmlsdavxq_s8: {
14317 uint32_t Param0;
14318 uint32_t Param1;
14319 uint32_t Param2;
14320 llvm::Type * Param3;
14321 switch (BuiltinID) {
14322 case ARM::BI__builtin_arm_mve_vmladavq_s16:
14323 Param0 = 0;
14324 Param1 = 0;
14325 Param2 = 0;
14326 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14327 break;
14328 case ARM::BI__builtin_arm_mve_vmladavq_s32:
14329 Param0 = 0;
14330 Param1 = 0;
14331 Param2 = 0;
14332 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14333 break;
14334 case ARM::BI__builtin_arm_mve_vmladavq_s8:
14335 Param0 = 0;
14336 Param1 = 0;
14337 Param2 = 0;
14338 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14339 break;
14340 case ARM::BI__builtin_arm_mve_vmladavq_u16:
14341 Param0 = 1;
14342 Param1 = 0;
14343 Param2 = 0;
14344 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14345 break;
14346 case ARM::BI__builtin_arm_mve_vmladavq_u32:
14347 Param0 = 1;
14348 Param1 = 0;
14349 Param2 = 0;
14350 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14351 break;
14352 case ARM::BI__builtin_arm_mve_vmladavq_u8:
14353 Param0 = 1;
14354 Param1 = 0;
14355 Param2 = 0;
14356 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14357 break;
14358 case ARM::BI__builtin_arm_mve_vmladavxq_s16:
14359 Param0 = 0;
14360 Param1 = 0;
14361 Param2 = 1;
14362 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14363 break;
14364 case ARM::BI__builtin_arm_mve_vmladavxq_s32:
14365 Param0 = 0;
14366 Param1 = 0;
14367 Param2 = 1;
14368 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14369 break;
14370 case ARM::BI__builtin_arm_mve_vmladavxq_s8:
14371 Param0 = 0;
14372 Param1 = 0;
14373 Param2 = 1;
14374 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14375 break;
14376 case ARM::BI__builtin_arm_mve_vmlsdavq_s16:
14377 Param0 = 0;
14378 Param1 = 1;
14379 Param2 = 0;
14380 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14381 break;
14382 case ARM::BI__builtin_arm_mve_vmlsdavq_s32:
14383 Param0 = 0;
14384 Param1 = 1;
14385 Param2 = 0;
14386 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14387 break;
14388 case ARM::BI__builtin_arm_mve_vmlsdavq_s8:
14389 Param0 = 0;
14390 Param1 = 1;
14391 Param2 = 0;
14392 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14393 break;
14394 case ARM::BI__builtin_arm_mve_vmlsdavxq_s16:
14395 Param0 = 0;
14396 Param1 = 1;
14397 Param2 = 1;
14398 Param3 = llvm::FixedVectorType::get(Int16Ty, 8);
14399 break;
14400 case ARM::BI__builtin_arm_mve_vmlsdavxq_s32:
14401 Param0 = 0;
14402 Param1 = 1;
14403 Param2 = 1;
14404 Param3 = llvm::FixedVectorType::get(Int32Ty, 4);
14405 break;
14406 case ARM::BI__builtin_arm_mve_vmlsdavxq_s8:
14407 Param0 = 0;
14408 Param1 = 1;
14409 Param2 = 1;
14410 Param3 = llvm::FixedVectorType::get(Int8Ty, 16);
14411 break;
14412 }
14413 Value *Val0 = llvm::ConstantInt::get(Int32Ty, Param0);
14414 Value *Val1 = llvm::ConstantInt::get(Int32Ty, Param1);
14415 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param2);
14416 llvm::Type *Val3 = Int32Ty;
14417 Value *Val4 = llvm::Constant::getNullValue(Val3);
14418 Value *Val5 = EmitScalarExpr(E->getArg(0));
14419 Value *Val6 = EmitScalarExpr(E->getArg(1));
14420 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmldava, {Param3}), {Val0, Val1, Val2, Val4, Val5, Val6});
14421 }
14422 case ARM::BI__builtin_arm_mve_vmlaldavq_s16:
14423 case ARM::BI__builtin_arm_mve_vmlaldavq_s32:
14424 case ARM::BI__builtin_arm_mve_vmlaldavq_u16:
14425 case ARM::BI__builtin_arm_mve_vmlaldavq_u32:
14426 case ARM::BI__builtin_arm_mve_vmlaldavxq_s16:
14427 case ARM::BI__builtin_arm_mve_vmlaldavxq_s32:
14428 case ARM::BI__builtin_arm_mve_vmlsldavq_s16:
14429 case ARM::BI__builtin_arm_mve_vmlsldavq_s32:
14430 case ARM::BI__builtin_arm_mve_vmlsldavxq_s16:
14431 case ARM::BI__builtin_arm_mve_vmlsldavxq_s32:
14432 case ARM::BI__builtin_arm_mve_vrmlaldavhq_s32:
14433 case ARM::BI__builtin_arm_mve_vrmlaldavhq_u32:
14434 case ARM::BI__builtin_arm_mve_vrmlaldavhxq_s32:
14435 case ARM::BI__builtin_arm_mve_vrmlsldavhq_s32:
14436 case ARM::BI__builtin_arm_mve_vrmlsldavhxq_s32: {
14437 uint32_t Param0;
14438 uint32_t Param1;
14439 uint32_t Param2;
14440 Intrinsic::ID Param3;
14441 llvm::Type * Param4;
14442 switch (BuiltinID) {
14443 case ARM::BI__builtin_arm_mve_vmlaldavq_s16:
14444 Param0 = 0;
14445 Param1 = 0;
14446 Param2 = 0;
14447 Param3 = Intrinsic::arm_mve_vmlldava;
14448 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14449 break;
14450 case ARM::BI__builtin_arm_mve_vmlaldavq_s32:
14451 Param0 = 0;
14452 Param1 = 0;
14453 Param2 = 0;
14454 Param3 = Intrinsic::arm_mve_vmlldava;
14455 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14456 break;
14457 case ARM::BI__builtin_arm_mve_vmlaldavq_u16:
14458 Param0 = 1;
14459 Param1 = 0;
14460 Param2 = 0;
14461 Param3 = Intrinsic::arm_mve_vmlldava;
14462 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14463 break;
14464 case ARM::BI__builtin_arm_mve_vmlaldavq_u32:
14465 Param0 = 1;
14466 Param1 = 0;
14467 Param2 = 0;
14468 Param3 = Intrinsic::arm_mve_vmlldava;
14469 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14470 break;
14471 case ARM::BI__builtin_arm_mve_vmlaldavxq_s16:
14472 Param0 = 0;
14473 Param1 = 0;
14474 Param2 = 1;
14475 Param3 = Intrinsic::arm_mve_vmlldava;
14476 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14477 break;
14478 case ARM::BI__builtin_arm_mve_vmlaldavxq_s32:
14479 Param0 = 0;
14480 Param1 = 0;
14481 Param2 = 1;
14482 Param3 = Intrinsic::arm_mve_vmlldava;
14483 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14484 break;
14485 case ARM::BI__builtin_arm_mve_vmlsldavq_s16:
14486 Param0 = 0;
14487 Param1 = 1;
14488 Param2 = 0;
14489 Param3 = Intrinsic::arm_mve_vmlldava;
14490 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14491 break;
14492 case ARM::BI__builtin_arm_mve_vmlsldavq_s32:
14493 Param0 = 0;
14494 Param1 = 1;
14495 Param2 = 0;
14496 Param3 = Intrinsic::arm_mve_vmlldava;
14497 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14498 break;
14499 case ARM::BI__builtin_arm_mve_vmlsldavxq_s16:
14500 Param0 = 0;
14501 Param1 = 1;
14502 Param2 = 1;
14503 Param3 = Intrinsic::arm_mve_vmlldava;
14504 Param4 = llvm::FixedVectorType::get(Int16Ty, 8);
14505 break;
14506 case ARM::BI__builtin_arm_mve_vmlsldavxq_s32:
14507 Param0 = 0;
14508 Param1 = 1;
14509 Param2 = 1;
14510 Param3 = Intrinsic::arm_mve_vmlldava;
14511 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14512 break;
14513 case ARM::BI__builtin_arm_mve_vrmlaldavhq_s32:
14514 Param0 = 0;
14515 Param1 = 0;
14516 Param2 = 0;
14517 Param3 = Intrinsic::arm_mve_vrmlldavha;
14518 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14519 break;
14520 case ARM::BI__builtin_arm_mve_vrmlaldavhq_u32:
14521 Param0 = 1;
14522 Param1 = 0;
14523 Param2 = 0;
14524 Param3 = Intrinsic::arm_mve_vrmlldavha;
14525 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14526 break;
14527 case ARM::BI__builtin_arm_mve_vrmlaldavhxq_s32:
14528 Param0 = 0;
14529 Param1 = 0;
14530 Param2 = 1;
14531 Param3 = Intrinsic::arm_mve_vrmlldavha;
14532 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14533 break;
14534 case ARM::BI__builtin_arm_mve_vrmlsldavhq_s32:
14535 Param0 = 0;
14536 Param1 = 1;
14537 Param2 = 0;
14538 Param3 = Intrinsic::arm_mve_vrmlldavha;
14539 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14540 break;
14541 case ARM::BI__builtin_arm_mve_vrmlsldavhxq_s32:
14542 Param0 = 0;
14543 Param1 = 1;
14544 Param2 = 1;
14545 Param3 = Intrinsic::arm_mve_vrmlldavha;
14546 Param4 = llvm::FixedVectorType::get(Int32Ty, 4);
14547 break;
14548 }
14549 llvm::Type *Val0 = Int32Ty;
14550 Value *Val1 = llvm::Constant::getNullValue(Val0);
14551 llvm::Type *Val2 = Int32Ty;
14552 Value *Val3 = llvm::Constant::getNullValue(Val2);
14553 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
14554 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
14555 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param2);
14556 Value *Val7 = EmitScalarExpr(E->getArg(0));
14557 Value *Val8 = EmitScalarExpr(E->getArg(1));
14558 Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param3, {Param4}), {Val4, Val5, Val6, Val3, Val1, Val7, Val8});
14559 Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
14560 Value *Val11 = Builder.CreateIntCast(Val10, Int64Ty, false);
14561 Value *Val12 = llvm::ConstantInt::get(Int64Ty, 32);
14562 Value *Val13 = Builder.CreateShl(Val11, Val12);
14563 Value *Val14 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
14564 Value *Val15 = Builder.CreateIntCast(Val14, Int64Ty, false);
14565 return Builder.CreateOr(Val13, Val15);
14566 }
14567 case ARM::BI__builtin_arm_mve_vmlaldavq_p_s16:
14568 case ARM::BI__builtin_arm_mve_vmlaldavq_p_s32:
14569 case ARM::BI__builtin_arm_mve_vmlaldavq_p_u16:
14570 case ARM::BI__builtin_arm_mve_vmlaldavq_p_u32:
14571 case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s16:
14572 case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s32:
14573 case ARM::BI__builtin_arm_mve_vmlsldavq_p_s16:
14574 case ARM::BI__builtin_arm_mve_vmlsldavq_p_s32:
14575 case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s16:
14576 case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s32:
14577 case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_s32:
14578 case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_u32:
14579 case ARM::BI__builtin_arm_mve_vrmlaldavhxq_p_s32:
14580 case ARM::BI__builtin_arm_mve_vrmlsldavhq_p_s32:
14581 case ARM::BI__builtin_arm_mve_vrmlsldavhxq_p_s32: {
14582 uint32_t Param0;
14583 uint32_t Param1;
14584 uint32_t Param2;
14585 llvm::Type * Param3;
14586 Intrinsic::ID Param4;
14587 llvm::Type * Param5;
14588 switch (BuiltinID) {
14589 case ARM::BI__builtin_arm_mve_vmlaldavq_p_s16:
14590 Param0 = 0;
14591 Param1 = 0;
14592 Param2 = 0;
14593 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14594 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14595 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
14596 break;
14597 case ARM::BI__builtin_arm_mve_vmlaldavq_p_s32:
14598 Param0 = 0;
14599 Param1 = 0;
14600 Param2 = 0;
14601 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14602 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14603 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14604 break;
14605 case ARM::BI__builtin_arm_mve_vmlaldavq_p_u16:
14606 Param0 = 1;
14607 Param1 = 0;
14608 Param2 = 0;
14609 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14610 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14611 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
14612 break;
14613 case ARM::BI__builtin_arm_mve_vmlaldavq_p_u32:
14614 Param0 = 1;
14615 Param1 = 0;
14616 Param2 = 0;
14617 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14618 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14619 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14620 break;
14621 case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s16:
14622 Param0 = 0;
14623 Param1 = 0;
14624 Param2 = 1;
14625 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14626 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14627 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
14628 break;
14629 case ARM::BI__builtin_arm_mve_vmlaldavxq_p_s32:
14630 Param0 = 0;
14631 Param1 = 0;
14632 Param2 = 1;
14633 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14634 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14635 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14636 break;
14637 case ARM::BI__builtin_arm_mve_vmlsldavq_p_s16:
14638 Param0 = 0;
14639 Param1 = 1;
14640 Param2 = 0;
14641 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14642 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14643 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
14644 break;
14645 case ARM::BI__builtin_arm_mve_vmlsldavq_p_s32:
14646 Param0 = 0;
14647 Param1 = 1;
14648 Param2 = 0;
14649 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14650 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14651 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14652 break;
14653 case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s16:
14654 Param0 = 0;
14655 Param1 = 1;
14656 Param2 = 1;
14657 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 8);
14658 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14659 Param5 = llvm::FixedVectorType::get(Int16Ty, 8);
14660 break;
14661 case ARM::BI__builtin_arm_mve_vmlsldavxq_p_s32:
14662 Param0 = 0;
14663 Param1 = 1;
14664 Param2 = 1;
14665 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14666 Param4 = Intrinsic::arm_mve_vmlldava_predicated;
14667 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14668 break;
14669 case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_s32:
14670 Param0 = 0;
14671 Param1 = 0;
14672 Param2 = 0;
14673 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14674 Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
14675 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14676 break;
14677 case ARM::BI__builtin_arm_mve_vrmlaldavhq_p_u32:
14678 Param0 = 1;
14679 Param1 = 0;
14680 Param2 = 0;
14681 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14682 Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
14683 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14684 break;
14685 case ARM::BI__builtin_arm_mve_vrmlaldavhxq_p_s32:
14686 Param0 = 0;
14687 Param1 = 0;
14688 Param2 = 1;
14689 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14690 Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
14691 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14692 break;
14693 case ARM::BI__builtin_arm_mve_vrmlsldavhq_p_s32:
14694 Param0 = 0;
14695 Param1 = 1;
14696 Param2 = 0;
14697 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14698 Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
14699 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14700 break;
14701 case ARM::BI__builtin_arm_mve_vrmlsldavhxq_p_s32:
14702 Param0 = 0;
14703 Param1 = 1;
14704 Param2 = 1;
14705 Param3 = llvm::FixedVectorType::get(Builder.getInt1Ty(), 4);
14706 Param4 = Intrinsic::arm_mve_vrmlldavha_predicated;
14707 Param5 = llvm::FixedVectorType::get(Int32Ty, 4);
14708 break;
14709 }
14710 llvm::Type *Val0 = Int32Ty;
14711 Value *Val1 = llvm::Constant::getNullValue(Val0);
14712 llvm::Type *Val2 = Int32Ty;
14713 Value *Val3 = llvm::Constant::getNullValue(Val2);
14714 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
14715 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
14716 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param2);
14717 Value *Val7 = EmitScalarExpr(E->getArg(0));
14718 Value *Val8 = EmitScalarExpr(E->getArg(1));
14719 Value *Val9 = EmitScalarExpr(E->getArg(2));
14720 Value *Val10 = Builder.CreateIntCast(Val9, Int32Ty, false);
14721 Value *Val11 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {Param3}), {Val10});
14722 Value *Val12 = Builder.CreateCall(CGM.getIntrinsic(Param4, {Param5, Param3}), {Val4, Val5, Val6, Val3, Val1, Val7, Val8, Val11});
14723 Value *Val13 = Builder.CreateExtractValue(Val12, static_cast<unsigned>(1));
14724 Value *Val14 = Builder.CreateIntCast(Val13, Int64Ty, false);
14725 Value *Val15 = llvm::ConstantInt::get(Int64Ty, 32);
14726 Value *Val16 = Builder.CreateShl(Val14, Val15);
14727 Value *Val17 = Builder.CreateExtractValue(Val12, static_cast<unsigned>(0));
14728 Value *Val18 = Builder.CreateIntCast(Val17, Int64Ty, false);
14729 return Builder.CreateOr(Val16, Val18);
14730 }
14731 case ARM::BI__builtin_arm_mve_vaddq_x_n_f32:
14732 case ARM::BI__builtin_arm_mve_vmulq_x_n_f32:
14733 case ARM::BI__builtin_arm_mve_vsubq_x_n_f32: {
14734 Intrinsic::ID Param0;
14735 switch (BuiltinID) {
14736 case ARM::BI__builtin_arm_mve_vaddq_x_n_f32:
14737 Param0 = Intrinsic::arm_mve_add_predicated;
14738 break;
14739 case ARM::BI__builtin_arm_mve_vmulq_x_n_f32:
14740 Param0 = Intrinsic::arm_mve_mul_predicated;
14741 break;
14742 case ARM::BI__builtin_arm_mve_vsubq_x_n_f32:
14743 Param0 = Intrinsic::arm_mve_sub_predicated;
14744 break;
14745 }
14746 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14747 Value *Val1 = UndefValue::get(Val0);
14748 Value *Val2 = EmitScalarExpr(E->getArg(0));
14749 Value *Val3 = EmitScalarExpr(E->getArg(1));
14750 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
14751 Value *Val5 = EmitScalarExpr(E->getArg(2));
14752 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
14753 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
14754 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val4, Val7, Val1});
14755 }
14756 case ARM::BI__builtin_arm_mve_vabsq_x_f32:
14757 case ARM::BI__builtin_arm_mve_vnegq_x_f32:
14758 case ARM::BI__builtin_arm_mve_vrndaq_x_f32:
14759 case ARM::BI__builtin_arm_mve_vrndmq_x_f32:
14760 case ARM::BI__builtin_arm_mve_vrndnq_x_f32:
14761 case ARM::BI__builtin_arm_mve_vrndpq_x_f32:
14762 case ARM::BI__builtin_arm_mve_vrndq_x_f32:
14763 case ARM::BI__builtin_arm_mve_vrndxq_x_f32: {
14764 Intrinsic::ID Param0;
14765 switch (BuiltinID) {
14766 case ARM::BI__builtin_arm_mve_vabsq_x_f32:
14767 Param0 = Intrinsic::arm_mve_abs_predicated;
14768 break;
14769 case ARM::BI__builtin_arm_mve_vnegq_x_f32:
14770 Param0 = Intrinsic::arm_mve_neg_predicated;
14771 break;
14772 case ARM::BI__builtin_arm_mve_vrndaq_x_f32:
14773 Param0 = Intrinsic::arm_mve_vrinta_predicated;
14774 break;
14775 case ARM::BI__builtin_arm_mve_vrndmq_x_f32:
14776 Param0 = Intrinsic::arm_mve_vrintm_predicated;
14777 break;
14778 case ARM::BI__builtin_arm_mve_vrndnq_x_f32:
14779 Param0 = Intrinsic::arm_mve_vrintn_predicated;
14780 break;
14781 case ARM::BI__builtin_arm_mve_vrndpq_x_f32:
14782 Param0 = Intrinsic::arm_mve_vrintp_predicated;
14783 break;
14784 case ARM::BI__builtin_arm_mve_vrndq_x_f32:
14785 Param0 = Intrinsic::arm_mve_vrintz_predicated;
14786 break;
14787 case ARM::BI__builtin_arm_mve_vrndxq_x_f32:
14788 Param0 = Intrinsic::arm_mve_vrintx_predicated;
14789 break;
14790 }
14791 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14792 Value *Val1 = UndefValue::get(Val0);
14793 Value *Val2 = EmitScalarExpr(E->getArg(0));
14794 Value *Val3 = EmitScalarExpr(E->getArg(1));
14795 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
14796 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
14797 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val1});
14798 }
14799 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f32: {
14800 Intrinsic::ID Param0;
14801 switch (BuiltinID) {
14802 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f32:
14803 Param0 = Intrinsic::arm_mve_vbrsr_predicated;
14804 break;
14805 }
14806 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14807 Value *Val1 = UndefValue::get(Val0);
14808 Value *Val2 = EmitScalarExpr(E->getArg(0));
14809 Value *Val3 = EmitScalarExpr(E->getArg(1));
14810 Value *Val4 = EmitScalarExpr(E->getArg(2));
14811 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
14812 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
14813 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val6});
14814 }
14815 case ARM::BI__builtin_arm_mve_vaddq_x_f32:
14816 case ARM::BI__builtin_arm_mve_vmulq_x_f32:
14817 case ARM::BI__builtin_arm_mve_vsubq_x_f32: {
14818 Intrinsic::ID Param0;
14819 switch (BuiltinID) {
14820 case ARM::BI__builtin_arm_mve_vaddq_x_f32:
14821 Param0 = Intrinsic::arm_mve_add_predicated;
14822 break;
14823 case ARM::BI__builtin_arm_mve_vmulq_x_f32:
14824 Param0 = Intrinsic::arm_mve_mul_predicated;
14825 break;
14826 case ARM::BI__builtin_arm_mve_vsubq_x_f32:
14827 Param0 = Intrinsic::arm_mve_sub_predicated;
14828 break;
14829 }
14830 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14831 Value *Val1 = UndefValue::get(Val0);
14832 Value *Val2 = EmitScalarExpr(E->getArg(0));
14833 Value *Val3 = EmitScalarExpr(E->getArg(1));
14834 Value *Val4 = EmitScalarExpr(E->getArg(2));
14835 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
14836 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
14837 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
14838 }
14839 case ARM::BI__builtin_arm_mve_vabdq_x_f32:
14840 case ARM::BI__builtin_arm_mve_vmaxnmq_x_f32:
14841 case ARM::BI__builtin_arm_mve_vminnmq_x_f32: {
14842 Intrinsic::ID Param0;
14843 switch (BuiltinID) {
14844 case ARM::BI__builtin_arm_mve_vabdq_x_f32:
14845 Param0 = Intrinsic::arm_mve_abd_predicated;
14846 break;
14847 case ARM::BI__builtin_arm_mve_vmaxnmq_x_f32:
14848 Param0 = Intrinsic::arm_mve_max_predicated;
14849 break;
14850 case ARM::BI__builtin_arm_mve_vminnmq_x_f32:
14851 Param0 = Intrinsic::arm_mve_min_predicated;
14852 break;
14853 }
14854 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14855 Value *Val1 = UndefValue::get(Val0);
14856 Value *Val2 = EmitScalarExpr(E->getArg(0));
14857 Value *Val3 = EmitScalarExpr(E->getArg(1));
14858 Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
14859 Value *Val5 = EmitScalarExpr(E->getArg(2));
14860 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
14861 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
14862 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val7, Val1});
14863 }
14864 case ARM::BI__builtin_arm_mve_vrev64q_x_f32: {
14865 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14866 Value *Val1 = UndefValue::get(Val0);
14867 Value *Val2 = EmitScalarExpr(E->getArg(0));
14868 Value *Val3 = llvm::ConstantInt::get(Int32Ty, 64);
14869 Value *Val4 = EmitScalarExpr(E->getArg(1));
14870 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
14871 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
14872 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
14873 }
14874 case ARM::BI__builtin_arm_mve_vcvtq_x_f32_s32:
14875 case ARM::BI__builtin_arm_mve_vcvtq_x_f32_u32: {
14876 uint32_t Param0;
14877 switch (BuiltinID) {
14878 case ARM::BI__builtin_arm_mve_vcvtq_x_f32_s32:
14879 Param0 = 0;
14880 break;
14881 case ARM::BI__builtin_arm_mve_vcvtq_x_f32_u32:
14882 Param0 = 1;
14883 break;
14884 }
14885 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14886 Value *Val1 = UndefValue::get(Val0);
14887 Value *Val2 = EmitScalarExpr(E->getArg(0));
14888 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
14889 Value *Val4 = EmitScalarExpr(E->getArg(1));
14890 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
14891 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
14892 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
14893 }
14894 case ARM::BI__builtin_arm_mve_vcvtbq_x_f32_f16:
14895 case ARM::BI__builtin_arm_mve_vcvttq_x_f32_f16: {
14896 uint32_t Param0;
14897 switch (BuiltinID) {
14898 case ARM::BI__builtin_arm_mve_vcvtbq_x_f32_f16:
14899 Param0 = 0;
14900 break;
14901 case ARM::BI__builtin_arm_mve_vcvttq_x_f32_f16:
14902 Param0 = 1;
14903 break;
14904 }
14905 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14906 Value *Val1 = UndefValue::get(Val0);
14907 Value *Val2 = EmitScalarExpr(E->getArg(0));
14908 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
14909 Value *Val4 = EmitScalarExpr(E->getArg(1));
14910 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
14911 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
14912 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_widen_predicated), {Val1, Val2, Val3, Val6});
14913 }
14914 case ARM::BI__builtin_arm_mve_vandq_x_f32:
14915 case ARM::BI__builtin_arm_mve_vbicq_x_f32:
14916 case ARM::BI__builtin_arm_mve_veorq_x_f32:
14917 case ARM::BI__builtin_arm_mve_vornq_x_f32:
14918 case ARM::BI__builtin_arm_mve_vorrq_x_f32: {
14919 Intrinsic::ID Param0;
14920 switch (BuiltinID) {
14921 case ARM::BI__builtin_arm_mve_vandq_x_f32:
14922 Param0 = Intrinsic::arm_mve_and_predicated;
14923 break;
14924 case ARM::BI__builtin_arm_mve_vbicq_x_f32:
14925 Param0 = Intrinsic::arm_mve_bic_predicated;
14926 break;
14927 case ARM::BI__builtin_arm_mve_veorq_x_f32:
14928 Param0 = Intrinsic::arm_mve_eor_predicated;
14929 break;
14930 case ARM::BI__builtin_arm_mve_vornq_x_f32:
14931 Param0 = Intrinsic::arm_mve_orn_predicated;
14932 break;
14933 case ARM::BI__builtin_arm_mve_vorrq_x_f32:
14934 Param0 = Intrinsic::arm_mve_orr_predicated;
14935 break;
14936 }
14937 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14938 Value *Val1 = UndefValue::get(Val0);
14939 Value *Val2 = EmitScalarExpr(E->getArg(0));
14940 llvm::Type *Val3 = llvm::FixedVectorType::get(Int32Ty, 4);
14941 Value *Val4 = Builder.CreateBitCast(Val2, Val3);
14942 Value *Val5 = EmitScalarExpr(E->getArg(1));
14943 llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
14944 Value *Val7 = Builder.CreateBitCast(Val5, Val6);
14945 Value *Val8 = EmitScalarExpr(E->getArg(2));
14946 Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
14947 Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val9});
14948 llvm::Type *Val11 = llvm::FixedVectorType::get(Int32Ty, 4);
14949 Value *Val12 = Builder.CreateBitCast(Val1, Val11);
14950 Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4, Val7, Val10, Val12});
14951 llvm::Type *Val14 = llvm::FixedVectorType::get(FloatTy, 4);
14952 return Builder.CreateBitCast(Val13, Val14);
14953 }
14954 case ARM::BI__builtin_arm_mve_vdupq_x_n_f32: {
14955 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14956 Value *Val1 = UndefValue::get(Val0);
14957 Value *Val2 = EmitScalarExpr(E->getArg(1));
14958 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
14959 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
14960 Value *Val5 = EmitScalarExpr(E->getArg(0));
14961 Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
14962 return Builder.CreateSelect(Val4, Val6, Val1);
14963 }
14964 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f32:
14965 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f32: {
14966 uint32_t Param0;
14967 switch (BuiltinID) {
14968 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f32:
14969 Param0 = 1;
14970 break;
14971 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f32:
14972 Param0 = 0;
14973 break;
14974 }
14975 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
14976 Value *Val1 = UndefValue::get(Val0);
14977 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
14978 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
14979 Value *Val4 = EmitScalarExpr(E->getArg(0));
14980 Value *Val5 = EmitScalarExpr(E->getArg(1));
14981 Value *Val6 = EmitScalarExpr(E->getArg(2));
14982 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
14983 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
14984 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val1, Val4, Val5, Val8});
14985 }
14986 case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f32:
14987 case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f32:
14988 case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f32:
14989 case ARM::BI__builtin_arm_mve_vcmulq_x_f32: {
14990 uint32_t Param0;
14991 switch (BuiltinID) {
14992 case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f32:
14993 Param0 = 2;
14994 break;
14995 case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f32:
14996 Param0 = 3;
14997 break;
14998 case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f32:
14999 Param0 = 1;
15000 break;
15001 case ARM::BI__builtin_arm_mve_vcmulq_x_f32:
15002 Param0 = 0;
15003 break;
15004 }
15005 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
15006 Value *Val1 = UndefValue::get(Val0);
15007 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
15008 Value *Val3 = EmitScalarExpr(E->getArg(0));
15009 Value *Val4 = EmitScalarExpr(E->getArg(1));
15010 Value *Val5 = EmitScalarExpr(E->getArg(2));
15011 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15012 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
15013 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcmulq_predicated, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val1, Val3, Val4, Val7});
15014 }
15015 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_s32:
15016 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_u32: {
15017 uint32_t Param0;
15018 switch (BuiltinID) {
15019 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_s32:
15020 Param0 = 0;
15021 break;
15022 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f32_u32:
15023 Param0 = 1;
15024 break;
15025 }
15026 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
15027 Value *Val1 = UndefValue::get(Val0);
15028 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
15029 Value *Val3 = EmitScalarExpr(E->getArg(0));
15030 Value *Val4 = EmitScalarExpr(E->getArg(1));
15031 Value *Val5 = EmitScalarExpr(E->getArg(2));
15032 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15033 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
15034 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val1, Val3, Val4, Val7});
15035 }
15036 case ARM::BI__builtin_arm_mve_vuninitializedq_f32:
15037 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_f32: {
15038 llvm::Type *Val0 = llvm::FixedVectorType::get(FloatTy, 4);
15039 return UndefValue::get(Val0);
15040 }
15041 case ARM::BI__builtin_arm_mve_vaddq_x_n_f16:
15042 case ARM::BI__builtin_arm_mve_vmulq_x_n_f16:
15043 case ARM::BI__builtin_arm_mve_vsubq_x_n_f16: {
15044 Intrinsic::ID Param0;
15045 switch (BuiltinID) {
15046 case ARM::BI__builtin_arm_mve_vaddq_x_n_f16:
15047 Param0 = Intrinsic::arm_mve_add_predicated;
15048 break;
15049 case ARM::BI__builtin_arm_mve_vmulq_x_n_f16:
15050 Param0 = Intrinsic::arm_mve_mul_predicated;
15051 break;
15052 case ARM::BI__builtin_arm_mve_vsubq_x_n_f16:
15053 Param0 = Intrinsic::arm_mve_sub_predicated;
15054 break;
15055 }
15056 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15057 Value *Val1 = UndefValue::get(Val0);
15058 Value *Val2 = EmitScalarExpr(E->getArg(0));
15059 Value *Val3 = EmitScalarExpr(E->getArg(1));
15060 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
15061 Value *Val5 = EmitScalarExpr(E->getArg(2));
15062 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15063 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15064 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val4, Val7, Val1});
15065 }
15066 case ARM::BI__builtin_arm_mve_vabsq_x_f16:
15067 case ARM::BI__builtin_arm_mve_vnegq_x_f16:
15068 case ARM::BI__builtin_arm_mve_vrndaq_x_f16:
15069 case ARM::BI__builtin_arm_mve_vrndmq_x_f16:
15070 case ARM::BI__builtin_arm_mve_vrndnq_x_f16:
15071 case ARM::BI__builtin_arm_mve_vrndpq_x_f16:
15072 case ARM::BI__builtin_arm_mve_vrndq_x_f16:
15073 case ARM::BI__builtin_arm_mve_vrndxq_x_f16: {
15074 Intrinsic::ID Param0;
15075 switch (BuiltinID) {
15076 case ARM::BI__builtin_arm_mve_vabsq_x_f16:
15077 Param0 = Intrinsic::arm_mve_abs_predicated;
15078 break;
15079 case ARM::BI__builtin_arm_mve_vnegq_x_f16:
15080 Param0 = Intrinsic::arm_mve_neg_predicated;
15081 break;
15082 case ARM::BI__builtin_arm_mve_vrndaq_x_f16:
15083 Param0 = Intrinsic::arm_mve_vrinta_predicated;
15084 break;
15085 case ARM::BI__builtin_arm_mve_vrndmq_x_f16:
15086 Param0 = Intrinsic::arm_mve_vrintm_predicated;
15087 break;
15088 case ARM::BI__builtin_arm_mve_vrndnq_x_f16:
15089 Param0 = Intrinsic::arm_mve_vrintn_predicated;
15090 break;
15091 case ARM::BI__builtin_arm_mve_vrndpq_x_f16:
15092 Param0 = Intrinsic::arm_mve_vrintp_predicated;
15093 break;
15094 case ARM::BI__builtin_arm_mve_vrndq_x_f16:
15095 Param0 = Intrinsic::arm_mve_vrintz_predicated;
15096 break;
15097 case ARM::BI__builtin_arm_mve_vrndxq_x_f16:
15098 Param0 = Intrinsic::arm_mve_vrintx_predicated;
15099 break;
15100 }
15101 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15102 Value *Val1 = UndefValue::get(Val0);
15103 Value *Val2 = EmitScalarExpr(E->getArg(0));
15104 Value *Val3 = EmitScalarExpr(E->getArg(1));
15105 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
15106 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
15107 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val1});
15108 }
15109 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f16: {
15110 Intrinsic::ID Param0;
15111 switch (BuiltinID) {
15112 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_f16:
15113 Param0 = Intrinsic::arm_mve_vbrsr_predicated;
15114 break;
15115 }
15116 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15117 Value *Val1 = UndefValue::get(Val0);
15118 Value *Val2 = EmitScalarExpr(E->getArg(0));
15119 Value *Val3 = EmitScalarExpr(E->getArg(1));
15120 Value *Val4 = EmitScalarExpr(E->getArg(2));
15121 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15122 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15123 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val6});
15124 }
15125 case ARM::BI__builtin_arm_mve_vaddq_x_f16:
15126 case ARM::BI__builtin_arm_mve_vmulq_x_f16:
15127 case ARM::BI__builtin_arm_mve_vsubq_x_f16: {
15128 Intrinsic::ID Param0;
15129 switch (BuiltinID) {
15130 case ARM::BI__builtin_arm_mve_vaddq_x_f16:
15131 Param0 = Intrinsic::arm_mve_add_predicated;
15132 break;
15133 case ARM::BI__builtin_arm_mve_vmulq_x_f16:
15134 Param0 = Intrinsic::arm_mve_mul_predicated;
15135 break;
15136 case ARM::BI__builtin_arm_mve_vsubq_x_f16:
15137 Param0 = Intrinsic::arm_mve_sub_predicated;
15138 break;
15139 }
15140 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15141 Value *Val1 = UndefValue::get(Val0);
15142 Value *Val2 = EmitScalarExpr(E->getArg(0));
15143 Value *Val3 = EmitScalarExpr(E->getArg(1));
15144 Value *Val4 = EmitScalarExpr(E->getArg(2));
15145 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15146 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15147 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15148 }
15149 case ARM::BI__builtin_arm_mve_vabdq_x_f16:
15150 case ARM::BI__builtin_arm_mve_vmaxnmq_x_f16:
15151 case ARM::BI__builtin_arm_mve_vminnmq_x_f16: {
15152 Intrinsic::ID Param0;
15153 switch (BuiltinID) {
15154 case ARM::BI__builtin_arm_mve_vabdq_x_f16:
15155 Param0 = Intrinsic::arm_mve_abd_predicated;
15156 break;
15157 case ARM::BI__builtin_arm_mve_vmaxnmq_x_f16:
15158 Param0 = Intrinsic::arm_mve_max_predicated;
15159 break;
15160 case ARM::BI__builtin_arm_mve_vminnmq_x_f16:
15161 Param0 = Intrinsic::arm_mve_min_predicated;
15162 break;
15163 }
15164 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15165 Value *Val1 = UndefValue::get(Val0);
15166 Value *Val2 = EmitScalarExpr(E->getArg(0));
15167 Value *Val3 = EmitScalarExpr(E->getArg(1));
15168 Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
15169 Value *Val5 = EmitScalarExpr(E->getArg(2));
15170 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15171 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15172 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val7, Val1});
15173 }
15174 case ARM::BI__builtin_arm_mve_vcvtq_x_f16_s16:
15175 case ARM::BI__builtin_arm_mve_vcvtq_x_f16_u16: {
15176 uint32_t Param0;
15177 switch (BuiltinID) {
15178 case ARM::BI__builtin_arm_mve_vcvtq_x_f16_s16:
15179 Param0 = 0;
15180 break;
15181 case ARM::BI__builtin_arm_mve_vcvtq_x_f16_u16:
15182 Param0 = 1;
15183 break;
15184 }
15185 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15186 Value *Val1 = UndefValue::get(Val0);
15187 Value *Val2 = EmitScalarExpr(E->getArg(0));
15188 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15189 Value *Val4 = EmitScalarExpr(E->getArg(1));
15190 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15191 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15192 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15193 }
15194 case ARM::BI__builtin_arm_mve_vrev32q_x_f16:
15195 case ARM::BI__builtin_arm_mve_vrev64q_x_f16: {
15196 uint32_t Param0;
15197 switch (BuiltinID) {
15198 case ARM::BI__builtin_arm_mve_vrev32q_x_f16:
15199 Param0 = 32;
15200 break;
15201 case ARM::BI__builtin_arm_mve_vrev64q_x_f16:
15202 Param0 = 64;
15203 break;
15204 }
15205 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15206 Value *Val1 = UndefValue::get(Val0);
15207 Value *Val2 = EmitScalarExpr(E->getArg(0));
15208 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15209 Value *Val4 = EmitScalarExpr(E->getArg(1));
15210 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15211 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15212 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15213 }
15214 case ARM::BI__builtin_arm_mve_vandq_x_f16:
15215 case ARM::BI__builtin_arm_mve_vbicq_x_f16:
15216 case ARM::BI__builtin_arm_mve_veorq_x_f16:
15217 case ARM::BI__builtin_arm_mve_vornq_x_f16:
15218 case ARM::BI__builtin_arm_mve_vorrq_x_f16: {
15219 Intrinsic::ID Param0;
15220 switch (BuiltinID) {
15221 case ARM::BI__builtin_arm_mve_vandq_x_f16:
15222 Param0 = Intrinsic::arm_mve_and_predicated;
15223 break;
15224 case ARM::BI__builtin_arm_mve_vbicq_x_f16:
15225 Param0 = Intrinsic::arm_mve_bic_predicated;
15226 break;
15227 case ARM::BI__builtin_arm_mve_veorq_x_f16:
15228 Param0 = Intrinsic::arm_mve_eor_predicated;
15229 break;
15230 case ARM::BI__builtin_arm_mve_vornq_x_f16:
15231 Param0 = Intrinsic::arm_mve_orn_predicated;
15232 break;
15233 case ARM::BI__builtin_arm_mve_vorrq_x_f16:
15234 Param0 = Intrinsic::arm_mve_orr_predicated;
15235 break;
15236 }
15237 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15238 Value *Val1 = UndefValue::get(Val0);
15239 Value *Val2 = EmitScalarExpr(E->getArg(0));
15240 llvm::Type *Val3 = llvm::FixedVectorType::get(Int16Ty, 8);
15241 Value *Val4 = Builder.CreateBitCast(Val2, Val3);
15242 Value *Val5 = EmitScalarExpr(E->getArg(1));
15243 llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
15244 Value *Val7 = Builder.CreateBitCast(Val5, Val6);
15245 Value *Val8 = EmitScalarExpr(E->getArg(2));
15246 Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
15247 Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val9});
15248 llvm::Type *Val11 = llvm::FixedVectorType::get(Int16Ty, 8);
15249 Value *Val12 = Builder.CreateBitCast(Val1, Val11);
15250 Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4, Val7, Val10, Val12});
15251 llvm::Type *Val14 = llvm::FixedVectorType::get(HalfTy, 8);
15252 return Builder.CreateBitCast(Val13, Val14);
15253 }
15254 case ARM::BI__builtin_arm_mve_vdupq_x_n_f16: {
15255 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15256 Value *Val1 = UndefValue::get(Val0);
15257 Value *Val2 = EmitScalarExpr(E->getArg(1));
15258 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
15259 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val3});
15260 Value *Val5 = EmitScalarExpr(E->getArg(0));
15261 Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
15262 return Builder.CreateSelect(Val4, Val6, Val1);
15263 }
15264 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f16:
15265 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f16: {
15266 uint32_t Param0;
15267 switch (BuiltinID) {
15268 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_f16:
15269 Param0 = 1;
15270 break;
15271 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_f16:
15272 Param0 = 0;
15273 break;
15274 }
15275 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15276 Value *Val1 = UndefValue::get(Val0);
15277 Value *Val2 = llvm::ConstantInt::get(Int32Ty, 1);
15278 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15279 Value *Val4 = EmitScalarExpr(E->getArg(0));
15280 Value *Val5 = EmitScalarExpr(E->getArg(1));
15281 Value *Val6 = EmitScalarExpr(E->getArg(2));
15282 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
15283 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
15284 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val1, Val4, Val5, Val8});
15285 }
15286 case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f16:
15287 case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f16:
15288 case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f16:
15289 case ARM::BI__builtin_arm_mve_vcmulq_x_f16: {
15290 uint32_t Param0;
15291 switch (BuiltinID) {
15292 case ARM::BI__builtin_arm_mve_vcmulq_rot180_x_f16:
15293 Param0 = 2;
15294 break;
15295 case ARM::BI__builtin_arm_mve_vcmulq_rot270_x_f16:
15296 Param0 = 3;
15297 break;
15298 case ARM::BI__builtin_arm_mve_vcmulq_rot90_x_f16:
15299 Param0 = 1;
15300 break;
15301 case ARM::BI__builtin_arm_mve_vcmulq_x_f16:
15302 Param0 = 0;
15303 break;
15304 }
15305 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15306 Value *Val1 = UndefValue::get(Val0);
15307 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
15308 Value *Val3 = EmitScalarExpr(E->getArg(0));
15309 Value *Val4 = EmitScalarExpr(E->getArg(1));
15310 Value *Val5 = EmitScalarExpr(E->getArg(2));
15311 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15312 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15313 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcmulq_predicated, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val1, Val3, Val4, Val7});
15314 }
15315 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_s16:
15316 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_u16: {
15317 uint32_t Param0;
15318 switch (BuiltinID) {
15319 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_s16:
15320 Param0 = 0;
15321 break;
15322 case ARM::BI__builtin_arm_mve_vcvtq_x_n_f16_u16:
15323 Param0 = 1;
15324 break;
15325 }
15326 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15327 Value *Val1 = UndefValue::get(Val0);
15328 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
15329 Value *Val3 = EmitScalarExpr(E->getArg(0));
15330 Value *Val4 = EmitScalarExpr(E->getArg(1));
15331 Value *Val5 = EmitScalarExpr(E->getArg(2));
15332 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15333 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15334 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val1, Val3, Val4, Val7});
15335 }
15336 case ARM::BI__builtin_arm_mve_vuninitializedq_f16:
15337 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_f16: {
15338 llvm::Type *Val0 = llvm::FixedVectorType::get(HalfTy, 8);
15339 return UndefValue::get(Val0);
15340 }
15341 case ARM::BI__builtin_arm_mve_vddupq_x_wb_u16:
15342 case ARM::BI__builtin_arm_mve_vidupq_x_wb_u16: {
15343 Intrinsic::ID Param0;
15344 switch (BuiltinID) {
15345 case ARM::BI__builtin_arm_mve_vddupq_x_wb_u16:
15346 Param0 = Intrinsic::arm_mve_vddup_predicated;
15347 break;
15348 case ARM::BI__builtin_arm_mve_vidupq_x_wb_u16:
15349 Param0 = Intrinsic::arm_mve_vidup_predicated;
15350 break;
15351 }
15352 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15353 Value *Val1 = UndefValue::get(Val0);
15354 Address Val2 = EmitPointerWithAlignment(E->getArg(0));
15355 Value *Val3 = Builder.CreateLoad(Val2);
15356 Value *Val4 = EmitScalarExpr(E->getArg(1));
15357 Value *Val5 = EmitScalarExpr(E->getArg(2));
15358 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15359 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15360 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val3, Val4, Val7});
15361 Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
15362 Builder.CreateStore(Val9, Val2);
15363 return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
15364 }
15365 case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u16:
15366 case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u16: {
15367 Intrinsic::ID Param0;
15368 switch (BuiltinID) {
15369 case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u16:
15370 Param0 = Intrinsic::arm_mve_vdwdup_predicated;
15371 break;
15372 case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u16:
15373 Param0 = Intrinsic::arm_mve_viwdup_predicated;
15374 break;
15375 }
15376 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15377 Value *Val1 = UndefValue::get(Val0);
15378 Address Val2 = EmitPointerWithAlignment(E->getArg(0));
15379 Value *Val3 = Builder.CreateLoad(Val2);
15380 Value *Val4 = EmitScalarExpr(E->getArg(1));
15381 Value *Val5 = EmitScalarExpr(E->getArg(2));
15382 Value *Val6 = EmitScalarExpr(E->getArg(3));
15383 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
15384 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
15385 Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val3, Val4, Val5, Val8});
15386 Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
15387 Builder.CreateStore(Val10, Val2);
15388 return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
15389 }
15390 case ARM::BI__builtin_arm_mve_vaddq_x_n_s16:
15391 case ARM::BI__builtin_arm_mve_vaddq_x_n_u16:
15392 case ARM::BI__builtin_arm_mve_vmulq_x_n_s16:
15393 case ARM::BI__builtin_arm_mve_vmulq_x_n_u16:
15394 case ARM::BI__builtin_arm_mve_vsubq_x_n_s16:
15395 case ARM::BI__builtin_arm_mve_vsubq_x_n_u16: {
15396 Intrinsic::ID Param0;
15397 switch (BuiltinID) {
15398 case ARM::BI__builtin_arm_mve_vaddq_x_n_s16:
15399 Param0 = Intrinsic::arm_mve_add_predicated;
15400 break;
15401 case ARM::BI__builtin_arm_mve_vaddq_x_n_u16:
15402 Param0 = Intrinsic::arm_mve_add_predicated;
15403 break;
15404 case ARM::BI__builtin_arm_mve_vmulq_x_n_s16:
15405 Param0 = Intrinsic::arm_mve_mul_predicated;
15406 break;
15407 case ARM::BI__builtin_arm_mve_vmulq_x_n_u16:
15408 Param0 = Intrinsic::arm_mve_mul_predicated;
15409 break;
15410 case ARM::BI__builtin_arm_mve_vsubq_x_n_s16:
15411 Param0 = Intrinsic::arm_mve_sub_predicated;
15412 break;
15413 case ARM::BI__builtin_arm_mve_vsubq_x_n_u16:
15414 Param0 = Intrinsic::arm_mve_sub_predicated;
15415 break;
15416 }
15417 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15418 Value *Val1 = UndefValue::get(Val0);
15419 Value *Val2 = EmitScalarExpr(E->getArg(0));
15420 Value *Val3 = EmitScalarExpr(E->getArg(1));
15421 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
15422 Value *Val5 = EmitScalarExpr(E->getArg(2));
15423 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15424 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15425 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val4, Val7, Val1});
15426 }
15427 case ARM::BI__builtin_arm_mve_vhaddq_x_n_s16:
15428 case ARM::BI__builtin_arm_mve_vhaddq_x_n_u16:
15429 case ARM::BI__builtin_arm_mve_vhsubq_x_n_s16:
15430 case ARM::BI__builtin_arm_mve_vhsubq_x_n_u16: {
15431 uint32_t Param0;
15432 Intrinsic::ID Param1;
15433 switch (BuiltinID) {
15434 case ARM::BI__builtin_arm_mve_vhaddq_x_n_s16:
15435 Param0 = 0;
15436 Param1 = Intrinsic::arm_mve_hadd_predicated;
15437 break;
15438 case ARM::BI__builtin_arm_mve_vhaddq_x_n_u16:
15439 Param0 = 1;
15440 Param1 = Intrinsic::arm_mve_hadd_predicated;
15441 break;
15442 case ARM::BI__builtin_arm_mve_vhsubq_x_n_s16:
15443 Param0 = 0;
15444 Param1 = Intrinsic::arm_mve_hsub_predicated;
15445 break;
15446 case ARM::BI__builtin_arm_mve_vhsubq_x_n_u16:
15447 Param0 = 1;
15448 Param1 = Intrinsic::arm_mve_hsub_predicated;
15449 break;
15450 }
15451 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15452 Value *Val1 = UndefValue::get(Val0);
15453 Value *Val2 = EmitScalarExpr(E->getArg(0));
15454 Value *Val3 = EmitScalarExpr(E->getArg(1));
15455 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
15456 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
15457 Value *Val6 = EmitScalarExpr(E->getArg(2));
15458 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
15459 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
15460 return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val4, Val5, Val8, Val1});
15461 }
15462 case ARM::BI__builtin_arm_mve_vabsq_x_s16:
15463 case ARM::BI__builtin_arm_mve_vclsq_x_s16:
15464 case ARM::BI__builtin_arm_mve_vclzq_x_s16:
15465 case ARM::BI__builtin_arm_mve_vclzq_x_u16:
15466 case ARM::BI__builtin_arm_mve_vmvnq_x_s16:
15467 case ARM::BI__builtin_arm_mve_vmvnq_x_u16:
15468 case ARM::BI__builtin_arm_mve_vnegq_x_s16: {
15469 Intrinsic::ID Param0;
15470 switch (BuiltinID) {
15471 case ARM::BI__builtin_arm_mve_vabsq_x_s16:
15472 Param0 = Intrinsic::arm_mve_abs_predicated;
15473 break;
15474 case ARM::BI__builtin_arm_mve_vclsq_x_s16:
15475 Param0 = Intrinsic::arm_mve_cls_predicated;
15476 break;
15477 case ARM::BI__builtin_arm_mve_vclzq_x_s16:
15478 Param0 = Intrinsic::arm_mve_clz_predicated;
15479 break;
15480 case ARM::BI__builtin_arm_mve_vclzq_x_u16:
15481 Param0 = Intrinsic::arm_mve_clz_predicated;
15482 break;
15483 case ARM::BI__builtin_arm_mve_vmvnq_x_s16:
15484 Param0 = Intrinsic::arm_mve_mvn_predicated;
15485 break;
15486 case ARM::BI__builtin_arm_mve_vmvnq_x_u16:
15487 Param0 = Intrinsic::arm_mve_mvn_predicated;
15488 break;
15489 case ARM::BI__builtin_arm_mve_vnegq_x_s16:
15490 Param0 = Intrinsic::arm_mve_neg_predicated;
15491 break;
15492 }
15493 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15494 Value *Val1 = UndefValue::get(Val0);
15495 Value *Val2 = EmitScalarExpr(E->getArg(0));
15496 Value *Val3 = EmitScalarExpr(E->getArg(1));
15497 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
15498 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4});
15499 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val5, Val1});
15500 }
15501 case ARM::BI__builtin_arm_mve_vddupq_x_n_u16:
15502 case ARM::BI__builtin_arm_mve_vidupq_x_n_u16: {
15503 Intrinsic::ID Param0;
15504 switch (BuiltinID) {
15505 case ARM::BI__builtin_arm_mve_vddupq_x_n_u16:
15506 Param0 = Intrinsic::arm_mve_vddup_predicated;
15507 break;
15508 case ARM::BI__builtin_arm_mve_vidupq_x_n_u16:
15509 Param0 = Intrinsic::arm_mve_vidup_predicated;
15510 break;
15511 }
15512 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15513 Value *Val1 = UndefValue::get(Val0);
15514 Value *Val2 = EmitScalarExpr(E->getArg(0));
15515 Value *Val3 = EmitScalarExpr(E->getArg(1));
15516 Value *Val4 = EmitScalarExpr(E->getArg(2));
15517 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15518 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15519 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val6});
15520 return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
15521 }
15522 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s16:
15523 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u16: {
15524 Intrinsic::ID Param0;
15525 switch (BuiltinID) {
15526 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s16:
15527 Param0 = Intrinsic::arm_mve_vbrsr_predicated;
15528 break;
15529 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u16:
15530 Param0 = Intrinsic::arm_mve_vbrsr_predicated;
15531 break;
15532 }
15533 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15534 Value *Val1 = UndefValue::get(Val0);
15535 Value *Val2 = EmitScalarExpr(E->getArg(0));
15536 Value *Val3 = EmitScalarExpr(E->getArg(1));
15537 Value *Val4 = EmitScalarExpr(E->getArg(2));
15538 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15539 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15540 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val6});
15541 }
15542 case ARM::BI__builtin_arm_mve_vaddq_x_s16:
15543 case ARM::BI__builtin_arm_mve_vaddq_x_u16:
15544 case ARM::BI__builtin_arm_mve_vmulq_x_s16:
15545 case ARM::BI__builtin_arm_mve_vmulq_x_u16:
15546 case ARM::BI__builtin_arm_mve_vshlq_x_n_s16:
15547 case ARM::BI__builtin_arm_mve_vshlq_x_n_u16:
15548 case ARM::BI__builtin_arm_mve_vsubq_x_s16:
15549 case ARM::BI__builtin_arm_mve_vsubq_x_u16: {
15550 Intrinsic::ID Param0;
15551 switch (BuiltinID) {
15552 case ARM::BI__builtin_arm_mve_vaddq_x_s16:
15553 Param0 = Intrinsic::arm_mve_add_predicated;
15554 break;
15555 case ARM::BI__builtin_arm_mve_vaddq_x_u16:
15556 Param0 = Intrinsic::arm_mve_add_predicated;
15557 break;
15558 case ARM::BI__builtin_arm_mve_vmulq_x_s16:
15559 Param0 = Intrinsic::arm_mve_mul_predicated;
15560 break;
15561 case ARM::BI__builtin_arm_mve_vmulq_x_u16:
15562 Param0 = Intrinsic::arm_mve_mul_predicated;
15563 break;
15564 case ARM::BI__builtin_arm_mve_vshlq_x_n_s16:
15565 Param0 = Intrinsic::arm_mve_shl_imm_predicated;
15566 break;
15567 case ARM::BI__builtin_arm_mve_vshlq_x_n_u16:
15568 Param0 = Intrinsic::arm_mve_shl_imm_predicated;
15569 break;
15570 case ARM::BI__builtin_arm_mve_vsubq_x_s16:
15571 Param0 = Intrinsic::arm_mve_sub_predicated;
15572 break;
15573 case ARM::BI__builtin_arm_mve_vsubq_x_u16:
15574 Param0 = Intrinsic::arm_mve_sub_predicated;
15575 break;
15576 }
15577 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15578 Value *Val1 = UndefValue::get(Val0);
15579 Value *Val2 = EmitScalarExpr(E->getArg(0));
15580 Value *Val3 = EmitScalarExpr(E->getArg(1));
15581 Value *Val4 = EmitScalarExpr(E->getArg(2));
15582 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15583 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15584 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15585 }
15586 case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u16:
15587 case ARM::BI__builtin_arm_mve_viwdupq_x_n_u16: {
15588 Intrinsic::ID Param0;
15589 switch (BuiltinID) {
15590 case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u16:
15591 Param0 = Intrinsic::arm_mve_vdwdup_predicated;
15592 break;
15593 case ARM::BI__builtin_arm_mve_viwdupq_x_n_u16:
15594 Param0 = Intrinsic::arm_mve_viwdup_predicated;
15595 break;
15596 }
15597 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15598 Value *Val1 = UndefValue::get(Val0);
15599 Value *Val2 = EmitScalarExpr(E->getArg(0));
15600 Value *Val3 = EmitScalarExpr(E->getArg(1));
15601 Value *Val4 = EmitScalarExpr(E->getArg(2));
15602 Value *Val5 = EmitScalarExpr(E->getArg(3));
15603 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15604 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15605 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val1, Val2, Val3, Val4, Val7});
15606 return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
15607 }
15608 case ARM::BI__builtin_arm_mve_vrshlq_x_s16:
15609 case ARM::BI__builtin_arm_mve_vrshlq_x_u16:
15610 case ARM::BI__builtin_arm_mve_vshlq_x_s16:
15611 case ARM::BI__builtin_arm_mve_vshlq_x_u16: {
15612 uint32_t Param0;
15613 uint32_t Param1;
15614 switch (BuiltinID) {
15615 case ARM::BI__builtin_arm_mve_vrshlq_x_s16:
15616 Param0 = 1;
15617 Param1 = 0;
15618 break;
15619 case ARM::BI__builtin_arm_mve_vrshlq_x_u16:
15620 Param0 = 1;
15621 Param1 = 1;
15622 break;
15623 case ARM::BI__builtin_arm_mve_vshlq_x_s16:
15624 Param0 = 0;
15625 Param1 = 0;
15626 break;
15627 case ARM::BI__builtin_arm_mve_vshlq_x_u16:
15628 Param0 = 0;
15629 Param1 = 1;
15630 break;
15631 }
15632 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15633 Value *Val1 = UndefValue::get(Val0);
15634 Value *Val2 = EmitScalarExpr(E->getArg(0));
15635 Value *Val3 = EmitScalarExpr(E->getArg(1));
15636 Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
15637 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
15638 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
15639 Value *Val7 = EmitScalarExpr(E->getArg(2));
15640 Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
15641 Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val8});
15642 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_vector_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val5, Val6, Val9, Val1});
15643 }
15644 case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p8:
15645 case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p8: {
15646 uint32_t Param0;
15647 switch (BuiltinID) {
15648 case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p8:
15649 Param0 = 0;
15650 break;
15651 case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p8:
15652 Param0 = 1;
15653 break;
15654 }
15655 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15656 Value *Val1 = UndefValue::get(Val0);
15657 Value *Val2 = EmitScalarExpr(E->getArg(0));
15658 Value *Val3 = EmitScalarExpr(E->getArg(1));
15659 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
15660 Value *Val5 = EmitScalarExpr(E->getArg(2));
15661 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15662 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15663 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_mull_poly_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val7, Val1});
15664 }
15665 case ARM::BI__builtin_arm_mve_vabdq_x_s16:
15666 case ARM::BI__builtin_arm_mve_vabdq_x_u16:
15667 case ARM::BI__builtin_arm_mve_vhaddq_x_s16:
15668 case ARM::BI__builtin_arm_mve_vhaddq_x_u16:
15669 case ARM::BI__builtin_arm_mve_vhsubq_x_s16:
15670 case ARM::BI__builtin_arm_mve_vhsubq_x_u16:
15671 case ARM::BI__builtin_arm_mve_vmaxq_x_s16:
15672 case ARM::BI__builtin_arm_mve_vmaxq_x_u16:
15673 case ARM::BI__builtin_arm_mve_vminq_x_s16:
15674 case ARM::BI__builtin_arm_mve_vminq_x_u16:
15675 case ARM::BI__builtin_arm_mve_vmulhq_x_s16:
15676 case ARM::BI__builtin_arm_mve_vmulhq_x_u16:
15677 case ARM::BI__builtin_arm_mve_vrhaddq_x_s16:
15678 case ARM::BI__builtin_arm_mve_vrhaddq_x_u16:
15679 case ARM::BI__builtin_arm_mve_vrmulhq_x_s16:
15680 case ARM::BI__builtin_arm_mve_vrmulhq_x_u16:
15681 case ARM::BI__builtin_arm_mve_vrshrq_x_n_s16:
15682 case ARM::BI__builtin_arm_mve_vrshrq_x_n_u16:
15683 case ARM::BI__builtin_arm_mve_vshrq_x_n_s16:
15684 case ARM::BI__builtin_arm_mve_vshrq_x_n_u16: {
15685 uint32_t Param0;
15686 Intrinsic::ID Param1;
15687 switch (BuiltinID) {
15688 case ARM::BI__builtin_arm_mve_vabdq_x_s16:
15689 Param0 = 0;
15690 Param1 = Intrinsic::arm_mve_abd_predicated;
15691 break;
15692 case ARM::BI__builtin_arm_mve_vabdq_x_u16:
15693 Param0 = 1;
15694 Param1 = Intrinsic::arm_mve_abd_predicated;
15695 break;
15696 case ARM::BI__builtin_arm_mve_vhaddq_x_s16:
15697 Param0 = 0;
15698 Param1 = Intrinsic::arm_mve_hadd_predicated;
15699 break;
15700 case ARM::BI__builtin_arm_mve_vhaddq_x_u16:
15701 Param0 = 1;
15702 Param1 = Intrinsic::arm_mve_hadd_predicated;
15703 break;
15704 case ARM::BI__builtin_arm_mve_vhsubq_x_s16:
15705 Param0 = 0;
15706 Param1 = Intrinsic::arm_mve_hsub_predicated;
15707 break;
15708 case ARM::BI__builtin_arm_mve_vhsubq_x_u16:
15709 Param0 = 1;
15710 Param1 = Intrinsic::arm_mve_hsub_predicated;
15711 break;
15712 case ARM::BI__builtin_arm_mve_vmaxq_x_s16:
15713 Param0 = 0;
15714 Param1 = Intrinsic::arm_mve_max_predicated;
15715 break;
15716 case ARM::BI__builtin_arm_mve_vmaxq_x_u16:
15717 Param0 = 1;
15718 Param1 = Intrinsic::arm_mve_max_predicated;
15719 break;
15720 case ARM::BI__builtin_arm_mve_vminq_x_s16:
15721 Param0 = 0;
15722 Param1 = Intrinsic::arm_mve_min_predicated;
15723 break;
15724 case ARM::BI__builtin_arm_mve_vminq_x_u16:
15725 Param0 = 1;
15726 Param1 = Intrinsic::arm_mve_min_predicated;
15727 break;
15728 case ARM::BI__builtin_arm_mve_vmulhq_x_s16:
15729 Param0 = 0;
15730 Param1 = Intrinsic::arm_mve_mulh_predicated;
15731 break;
15732 case ARM::BI__builtin_arm_mve_vmulhq_x_u16:
15733 Param0 = 1;
15734 Param1 = Intrinsic::arm_mve_mulh_predicated;
15735 break;
15736 case ARM::BI__builtin_arm_mve_vrhaddq_x_s16:
15737 Param0 = 0;
15738 Param1 = Intrinsic::arm_mve_rhadd_predicated;
15739 break;
15740 case ARM::BI__builtin_arm_mve_vrhaddq_x_u16:
15741 Param0 = 1;
15742 Param1 = Intrinsic::arm_mve_rhadd_predicated;
15743 break;
15744 case ARM::BI__builtin_arm_mve_vrmulhq_x_s16:
15745 Param0 = 0;
15746 Param1 = Intrinsic::arm_mve_rmulh_predicated;
15747 break;
15748 case ARM::BI__builtin_arm_mve_vrmulhq_x_u16:
15749 Param0 = 1;
15750 Param1 = Intrinsic::arm_mve_rmulh_predicated;
15751 break;
15752 case ARM::BI__builtin_arm_mve_vrshrq_x_n_s16:
15753 Param0 = 0;
15754 Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
15755 break;
15756 case ARM::BI__builtin_arm_mve_vrshrq_x_n_u16:
15757 Param0 = 1;
15758 Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
15759 break;
15760 case ARM::BI__builtin_arm_mve_vshrq_x_n_s16:
15761 Param0 = 0;
15762 Param1 = Intrinsic::arm_mve_shr_imm_predicated;
15763 break;
15764 case ARM::BI__builtin_arm_mve_vshrq_x_n_u16:
15765 Param0 = 1;
15766 Param1 = Intrinsic::arm_mve_shr_imm_predicated;
15767 break;
15768 }
15769 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15770 Value *Val1 = UndefValue::get(Val0);
15771 Value *Val2 = EmitScalarExpr(E->getArg(0));
15772 Value *Val3 = EmitScalarExpr(E->getArg(1));
15773 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
15774 Value *Val5 = EmitScalarExpr(E->getArg(2));
15775 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15776 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15777 return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val7, Val1});
15778 }
15779 case ARM::BI__builtin_arm_mve_vmullbq_int_x_s8:
15780 case ARM::BI__builtin_arm_mve_vmullbq_int_x_u8:
15781 case ARM::BI__builtin_arm_mve_vmulltq_int_x_s8:
15782 case ARM::BI__builtin_arm_mve_vmulltq_int_x_u8:
15783 case ARM::BI__builtin_arm_mve_vshllbq_x_n_s8:
15784 case ARM::BI__builtin_arm_mve_vshllbq_x_n_u8:
15785 case ARM::BI__builtin_arm_mve_vshlltq_x_n_s8:
15786 case ARM::BI__builtin_arm_mve_vshlltq_x_n_u8: {
15787 uint32_t Param0;
15788 uint32_t Param1;
15789 Intrinsic::ID Param2;
15790 switch (BuiltinID) {
15791 case ARM::BI__builtin_arm_mve_vmullbq_int_x_s8:
15792 Param0 = 0;
15793 Param1 = 0;
15794 Param2 = Intrinsic::arm_mve_mull_int_predicated;
15795 break;
15796 case ARM::BI__builtin_arm_mve_vmullbq_int_x_u8:
15797 Param0 = 1;
15798 Param1 = 0;
15799 Param2 = Intrinsic::arm_mve_mull_int_predicated;
15800 break;
15801 case ARM::BI__builtin_arm_mve_vmulltq_int_x_s8:
15802 Param0 = 0;
15803 Param1 = 1;
15804 Param2 = Intrinsic::arm_mve_mull_int_predicated;
15805 break;
15806 case ARM::BI__builtin_arm_mve_vmulltq_int_x_u8:
15807 Param0 = 1;
15808 Param1 = 1;
15809 Param2 = Intrinsic::arm_mve_mull_int_predicated;
15810 break;
15811 case ARM::BI__builtin_arm_mve_vshllbq_x_n_s8:
15812 Param0 = 0;
15813 Param1 = 0;
15814 Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
15815 break;
15816 case ARM::BI__builtin_arm_mve_vshllbq_x_n_u8:
15817 Param0 = 1;
15818 Param1 = 0;
15819 Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
15820 break;
15821 case ARM::BI__builtin_arm_mve_vshlltq_x_n_s8:
15822 Param0 = 0;
15823 Param1 = 1;
15824 Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
15825 break;
15826 case ARM::BI__builtin_arm_mve_vshlltq_x_n_u8:
15827 Param0 = 1;
15828 Param1 = 1;
15829 Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
15830 break;
15831 }
15832 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15833 Value *Val1 = UndefValue::get(Val0);
15834 Value *Val2 = EmitScalarExpr(E->getArg(0));
15835 Value *Val3 = EmitScalarExpr(E->getArg(1));
15836 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
15837 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
15838 Value *Val6 = EmitScalarExpr(E->getArg(2));
15839 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
15840 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
15841 return Builder.CreateCall(CGM.getIntrinsic(Param2, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val5, Val8, Val1});
15842 }
15843 case ARM::BI__builtin_arm_mve_vcvtq_x_s16_f16:
15844 case ARM::BI__builtin_arm_mve_vcvtq_x_u16_f16: {
15845 uint32_t Param0;
15846 switch (BuiltinID) {
15847 case ARM::BI__builtin_arm_mve_vcvtq_x_s16_f16:
15848 Param0 = 0;
15849 break;
15850 case ARM::BI__builtin_arm_mve_vcvtq_x_u16_f16:
15851 Param0 = 1;
15852 break;
15853 }
15854 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15855 Value *Val1 = UndefValue::get(Val0);
15856 Value *Val2 = EmitScalarExpr(E->getArg(0));
15857 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15858 Value *Val4 = EmitScalarExpr(E->getArg(1));
15859 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15860 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15861 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15862 }
15863 case ARM::BI__builtin_arm_mve_vrev32q_x_s16:
15864 case ARM::BI__builtin_arm_mve_vrev32q_x_u16:
15865 case ARM::BI__builtin_arm_mve_vrev64q_x_s16:
15866 case ARM::BI__builtin_arm_mve_vrev64q_x_u16: {
15867 uint32_t Param0;
15868 switch (BuiltinID) {
15869 case ARM::BI__builtin_arm_mve_vrev32q_x_s16:
15870 Param0 = 32;
15871 break;
15872 case ARM::BI__builtin_arm_mve_vrev32q_x_u16:
15873 Param0 = 32;
15874 break;
15875 case ARM::BI__builtin_arm_mve_vrev64q_x_s16:
15876 Param0 = 64;
15877 break;
15878 case ARM::BI__builtin_arm_mve_vrev64q_x_u16:
15879 Param0 = 64;
15880 break;
15881 }
15882 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15883 Value *Val1 = UndefValue::get(Val0);
15884 Value *Val2 = EmitScalarExpr(E->getArg(0));
15885 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15886 Value *Val4 = EmitScalarExpr(E->getArg(1));
15887 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
15888 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
15889 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val6, Val1});
15890 }
15891 case ARM::BI__builtin_arm_mve_vmovlbq_x_s8:
15892 case ARM::BI__builtin_arm_mve_vmovlbq_x_u8:
15893 case ARM::BI__builtin_arm_mve_vmovltq_x_s8:
15894 case ARM::BI__builtin_arm_mve_vmovltq_x_u8: {
15895 uint32_t Param0;
15896 uint32_t Param1;
15897 switch (BuiltinID) {
15898 case ARM::BI__builtin_arm_mve_vmovlbq_x_s8:
15899 Param0 = 0;
15900 Param1 = 0;
15901 break;
15902 case ARM::BI__builtin_arm_mve_vmovlbq_x_u8:
15903 Param0 = 1;
15904 Param1 = 0;
15905 break;
15906 case ARM::BI__builtin_arm_mve_vmovltq_x_s8:
15907 Param0 = 0;
15908 Param1 = 1;
15909 break;
15910 case ARM::BI__builtin_arm_mve_vmovltq_x_u8:
15911 Param0 = 1;
15912 Param1 = 1;
15913 break;
15914 }
15915 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15916 Value *Val1 = UndefValue::get(Val0);
15917 Value *Val2 = EmitScalarExpr(E->getArg(0));
15918 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
15919 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
15920 Value *Val5 = EmitScalarExpr(E->getArg(1));
15921 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
15922 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
15923 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmovl_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val4, Val7, Val1});
15924 }
15925 case ARM::BI__builtin_arm_mve_vandq_x_s16:
15926 case ARM::BI__builtin_arm_mve_vandq_x_u16:
15927 case ARM::BI__builtin_arm_mve_vbicq_x_s16:
15928 case ARM::BI__builtin_arm_mve_vbicq_x_u16:
15929 case ARM::BI__builtin_arm_mve_veorq_x_s16:
15930 case ARM::BI__builtin_arm_mve_veorq_x_u16:
15931 case ARM::BI__builtin_arm_mve_vornq_x_s16:
15932 case ARM::BI__builtin_arm_mve_vornq_x_u16:
15933 case ARM::BI__builtin_arm_mve_vorrq_x_s16:
15934 case ARM::BI__builtin_arm_mve_vorrq_x_u16: {
15935 Intrinsic::ID Param0;
15936 switch (BuiltinID) {
15937 case ARM::BI__builtin_arm_mve_vandq_x_s16:
15938 Param0 = Intrinsic::arm_mve_and_predicated;
15939 break;
15940 case ARM::BI__builtin_arm_mve_vandq_x_u16:
15941 Param0 = Intrinsic::arm_mve_and_predicated;
15942 break;
15943 case ARM::BI__builtin_arm_mve_vbicq_x_s16:
15944 Param0 = Intrinsic::arm_mve_bic_predicated;
15945 break;
15946 case ARM::BI__builtin_arm_mve_vbicq_x_u16:
15947 Param0 = Intrinsic::arm_mve_bic_predicated;
15948 break;
15949 case ARM::BI__builtin_arm_mve_veorq_x_s16:
15950 Param0 = Intrinsic::arm_mve_eor_predicated;
15951 break;
15952 case ARM::BI__builtin_arm_mve_veorq_x_u16:
15953 Param0 = Intrinsic::arm_mve_eor_predicated;
15954 break;
15955 case ARM::BI__builtin_arm_mve_vornq_x_s16:
15956 Param0 = Intrinsic::arm_mve_orn_predicated;
15957 break;
15958 case ARM::BI__builtin_arm_mve_vornq_x_u16:
15959 Param0 = Intrinsic::arm_mve_orn_predicated;
15960 break;
15961 case ARM::BI__builtin_arm_mve_vorrq_x_s16:
15962 Param0 = Intrinsic::arm_mve_orr_predicated;
15963 break;
15964 case ARM::BI__builtin_arm_mve_vorrq_x_u16:
15965 Param0 = Intrinsic::arm_mve_orr_predicated;
15966 break;
15967 }
15968 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15969 Value *Val1 = UndefValue::get(Val0);
15970 Value *Val2 = EmitScalarExpr(E->getArg(0));
15971 llvm::Type *Val3 = llvm::FixedVectorType::get(Int16Ty, 8);
15972 Value *Val4 = Builder.CreateBitCast(Val2, Val3);
15973 Value *Val5 = EmitScalarExpr(E->getArg(1));
15974 llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
15975 Value *Val7 = Builder.CreateBitCast(Val5, Val6);
15976 Value *Val8 = EmitScalarExpr(E->getArg(2));
15977 Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
15978 Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val9});
15979 llvm::Type *Val11 = llvm::FixedVectorType::get(Int16Ty, 8);
15980 Value *Val12 = Builder.CreateBitCast(Val1, Val11);
15981 Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val4, Val7, Val10, Val12});
15982 llvm::Type *Val14 = llvm::FixedVectorType::get(Int16Ty, 8);
15983 return Builder.CreateBitCast(Val13, Val14);
15984 }
15985 case ARM::BI__builtin_arm_mve_vdupq_x_n_s16:
15986 case ARM::BI__builtin_arm_mve_vdupq_x_n_u16: {
15987 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
15988 Value *Val1 = UndefValue::get(Val0);
15989 Value *Val2 = EmitScalarExpr(E->getArg(1));
15990 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
15991 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val3});
15992 Value *Val5 = EmitScalarExpr(E->getArg(0));
15993 Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
15994 return Builder.CreateSelect(Val4, Val6, Val1);
15995 }
15996 case ARM::BI__builtin_arm_mve_vmvnq_x_n_s16:
15997 case ARM::BI__builtin_arm_mve_vmvnq_x_n_u16: {
15998 bool Param0;
15999 switch (BuiltinID) {
16000 case ARM::BI__builtin_arm_mve_vmvnq_x_n_s16:
16001 Param0 = true;
16002 break;
16003 case ARM::BI__builtin_arm_mve_vmvnq_x_n_u16:
16004 Param0 = false;
16005 break;
16006 }
16007 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16008 Value *Val1 = UndefValue::get(Val0);
16009 Value *Val2 = EmitScalarExpr(E->getArg(1));
16010 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
16011 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val3});
16012 Value *Val5 = EmitScalarExpr(E->getArg(0));
16013 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16014 Value *Val7 = Builder.CreateIntCast(Val6, Int16Ty, Param0);
16015 Value *Val8 = ARMMVEVectorSplat(Builder, Val7);
16016 Value *Val9 = Builder.CreateNot(Val8);
16017 return Builder.CreateSelect(Val4, Val9, Val1);
16018 }
16019 case ARM::BI__builtin_arm_mve_vcvtaq_x_s16_f16:
16020 case ARM::BI__builtin_arm_mve_vcvtaq_x_u16_f16:
16021 case ARM::BI__builtin_arm_mve_vcvtmq_x_s16_f16:
16022 case ARM::BI__builtin_arm_mve_vcvtmq_x_u16_f16:
16023 case ARM::BI__builtin_arm_mve_vcvtnq_x_s16_f16:
16024 case ARM::BI__builtin_arm_mve_vcvtnq_x_u16_f16:
16025 case ARM::BI__builtin_arm_mve_vcvtpq_x_s16_f16:
16026 case ARM::BI__builtin_arm_mve_vcvtpq_x_u16_f16: {
16027 uint32_t Param0;
16028 Intrinsic::ID Param1;
16029 switch (BuiltinID) {
16030 case ARM::BI__builtin_arm_mve_vcvtaq_x_s16_f16:
16031 Param0 = 0;
16032 Param1 = Intrinsic::arm_mve_vcvta_predicated;
16033 break;
16034 case ARM::BI__builtin_arm_mve_vcvtaq_x_u16_f16:
16035 Param0 = 1;
16036 Param1 = Intrinsic::arm_mve_vcvta_predicated;
16037 break;
16038 case ARM::BI__builtin_arm_mve_vcvtmq_x_s16_f16:
16039 Param0 = 0;
16040 Param1 = Intrinsic::arm_mve_vcvtm_predicated;
16041 break;
16042 case ARM::BI__builtin_arm_mve_vcvtmq_x_u16_f16:
16043 Param0 = 1;
16044 Param1 = Intrinsic::arm_mve_vcvtm_predicated;
16045 break;
16046 case ARM::BI__builtin_arm_mve_vcvtnq_x_s16_f16:
16047 Param0 = 0;
16048 Param1 = Intrinsic::arm_mve_vcvtn_predicated;
16049 break;
16050 case ARM::BI__builtin_arm_mve_vcvtnq_x_u16_f16:
16051 Param0 = 1;
16052 Param1 = Intrinsic::arm_mve_vcvtn_predicated;
16053 break;
16054 case ARM::BI__builtin_arm_mve_vcvtpq_x_s16_f16:
16055 Param0 = 0;
16056 Param1 = Intrinsic::arm_mve_vcvtp_predicated;
16057 break;
16058 case ARM::BI__builtin_arm_mve_vcvtpq_x_u16_f16:
16059 Param0 = 1;
16060 Param1 = Intrinsic::arm_mve_vcvtp_predicated;
16061 break;
16062 }
16063 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16064 Value *Val1 = UndefValue::get(Val0);
16065 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16066 Value *Val3 = EmitScalarExpr(E->getArg(0));
16067 Value *Val4 = EmitScalarExpr(E->getArg(1));
16068 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16069 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val5});
16070 return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val1, Val3, Val6});
16071 }
16072 case ARM::BI__builtin_arm_mve_vcvtq_x_n_s16_f16:
16073 case ARM::BI__builtin_arm_mve_vcvtq_x_n_u16_f16: {
16074 uint32_t Param0;
16075 switch (BuiltinID) {
16076 case ARM::BI__builtin_arm_mve_vcvtq_x_n_s16_f16:
16077 Param0 = 0;
16078 break;
16079 case ARM::BI__builtin_arm_mve_vcvtq_x_n_u16_f16:
16080 Param0 = 1;
16081 break;
16082 }
16083 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16084 Value *Val1 = UndefValue::get(Val0);
16085 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16086 Value *Val3 = EmitScalarExpr(E->getArg(0));
16087 Value *Val4 = EmitScalarExpr(E->getArg(1));
16088 Value *Val5 = EmitScalarExpr(E->getArg(2));
16089 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16090 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val6});
16091 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(HalfTy, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val1, Val3, Val4, Val7});
16092 }
16093 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s16:
16094 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u16:
16095 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s16:
16096 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u16:
16097 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s16:
16098 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s16: {
16099 uint32_t Param0;
16100 uint32_t Param1;
16101 switch (BuiltinID) {
16102 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s16:
16103 Param0 = 1;
16104 Param1 = 1;
16105 break;
16106 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u16:
16107 Param0 = 1;
16108 Param1 = 1;
16109 break;
16110 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s16:
16111 Param0 = 1;
16112 Param1 = 0;
16113 break;
16114 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u16:
16115 Param0 = 1;
16116 Param1 = 0;
16117 break;
16118 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s16:
16119 Param0 = 0;
16120 Param1 = 1;
16121 break;
16122 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s16:
16123 Param0 = 0;
16124 Param1 = 0;
16125 break;
16126 }
16127 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16128 Value *Val1 = UndefValue::get(Val0);
16129 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16130 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
16131 Value *Val4 = EmitScalarExpr(E->getArg(0));
16132 Value *Val5 = EmitScalarExpr(E->getArg(1));
16133 Value *Val6 = EmitScalarExpr(E->getArg(2));
16134 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
16135 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val7});
16136 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 8)}), {Val2, Val3, Val1, Val4, Val5, Val8});
16137 }
16138 case ARM::BI__builtin_arm_mve_vnegq_s16: {
16139 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16140 Value *Val1 = llvm::Constant::getNullValue(Val0);
16141 Value *Val2 = EmitScalarExpr(E->getArg(0));
16142 return Builder.CreateSub(Val1, Val2);
16143 }
16144 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s16:
16145 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u16:
16146 case ARM::BI__builtin_arm_mve_vuninitializedq_s16:
16147 case ARM::BI__builtin_arm_mve_vuninitializedq_u16: {
16148 llvm::Type *Val0 = llvm::FixedVectorType::get(Int16Ty, 8);
16149 return UndefValue::get(Val0);
16150 }
16151 case ARM::BI__builtin_arm_mve_vddupq_x_wb_u32:
16152 case ARM::BI__builtin_arm_mve_vidupq_x_wb_u32: {
16153 Intrinsic::ID Param0;
16154 switch (BuiltinID) {
16155 case ARM::BI__builtin_arm_mve_vddupq_x_wb_u32:
16156 Param0 = Intrinsic::arm_mve_vddup_predicated;
16157 break;
16158 case ARM::BI__builtin_arm_mve_vidupq_x_wb_u32:
16159 Param0 = Intrinsic::arm_mve_vidup_predicated;
16160 break;
16161 }
16162 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16163 Value *Val1 = UndefValue::get(Val0);
16164 Address Val2 = EmitPointerWithAlignment(E->getArg(0));
16165 Value *Val3 = Builder.CreateLoad(Val2);
16166 Value *Val4 = EmitScalarExpr(E->getArg(1));
16167 Value *Val5 = EmitScalarExpr(E->getArg(2));
16168 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16169 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16170 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val3, Val4, Val7});
16171 Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
16172 Builder.CreateStore(Val9, Val2);
16173 return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
16174 }
16175 case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u32:
16176 case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u32: {
16177 Intrinsic::ID Param0;
16178 switch (BuiltinID) {
16179 case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u32:
16180 Param0 = Intrinsic::arm_mve_vdwdup_predicated;
16181 break;
16182 case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u32:
16183 Param0 = Intrinsic::arm_mve_viwdup_predicated;
16184 break;
16185 }
16186 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16187 Value *Val1 = UndefValue::get(Val0);
16188 Address Val2 = EmitPointerWithAlignment(E->getArg(0));
16189 Value *Val3 = Builder.CreateLoad(Val2);
16190 Value *Val4 = EmitScalarExpr(E->getArg(1));
16191 Value *Val5 = EmitScalarExpr(E->getArg(2));
16192 Value *Val6 = EmitScalarExpr(E->getArg(3));
16193 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
16194 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
16195 Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val3, Val4, Val5, Val8});
16196 Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
16197 Builder.CreateStore(Val10, Val2);
16198 return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
16199 }
16200 case ARM::BI__builtin_arm_mve_vaddq_x_n_s32:
16201 case ARM::BI__builtin_arm_mve_vaddq_x_n_u32:
16202 case ARM::BI__builtin_arm_mve_vmulq_x_n_s32:
16203 case ARM::BI__builtin_arm_mve_vmulq_x_n_u32:
16204 case ARM::BI__builtin_arm_mve_vsubq_x_n_s32:
16205 case ARM::BI__builtin_arm_mve_vsubq_x_n_u32: {
16206 Intrinsic::ID Param0;
16207 switch (BuiltinID) {
16208 case ARM::BI__builtin_arm_mve_vaddq_x_n_s32:
16209 Param0 = Intrinsic::arm_mve_add_predicated;
16210 break;
16211 case ARM::BI__builtin_arm_mve_vaddq_x_n_u32:
16212 Param0 = Intrinsic::arm_mve_add_predicated;
16213 break;
16214 case ARM::BI__builtin_arm_mve_vmulq_x_n_s32:
16215 Param0 = Intrinsic::arm_mve_mul_predicated;
16216 break;
16217 case ARM::BI__builtin_arm_mve_vmulq_x_n_u32:
16218 Param0 = Intrinsic::arm_mve_mul_predicated;
16219 break;
16220 case ARM::BI__builtin_arm_mve_vsubq_x_n_s32:
16221 Param0 = Intrinsic::arm_mve_sub_predicated;
16222 break;
16223 case ARM::BI__builtin_arm_mve_vsubq_x_n_u32:
16224 Param0 = Intrinsic::arm_mve_sub_predicated;
16225 break;
16226 }
16227 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16228 Value *Val1 = UndefValue::get(Val0);
16229 Value *Val2 = EmitScalarExpr(E->getArg(0));
16230 Value *Val3 = EmitScalarExpr(E->getArg(1));
16231 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
16232 Value *Val5 = EmitScalarExpr(E->getArg(2));
16233 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16234 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16235 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val4, Val7, Val1});
16236 }
16237 case ARM::BI__builtin_arm_mve_vhaddq_x_n_s32:
16238 case ARM::BI__builtin_arm_mve_vhaddq_x_n_u32:
16239 case ARM::BI__builtin_arm_mve_vhsubq_x_n_s32:
16240 case ARM::BI__builtin_arm_mve_vhsubq_x_n_u32: {
16241 uint32_t Param0;
16242 Intrinsic::ID Param1;
16243 switch (BuiltinID) {
16244 case ARM::BI__builtin_arm_mve_vhaddq_x_n_s32:
16245 Param0 = 0;
16246 Param1 = Intrinsic::arm_mve_hadd_predicated;
16247 break;
16248 case ARM::BI__builtin_arm_mve_vhaddq_x_n_u32:
16249 Param0 = 1;
16250 Param1 = Intrinsic::arm_mve_hadd_predicated;
16251 break;
16252 case ARM::BI__builtin_arm_mve_vhsubq_x_n_s32:
16253 Param0 = 0;
16254 Param1 = Intrinsic::arm_mve_hsub_predicated;
16255 break;
16256 case ARM::BI__builtin_arm_mve_vhsubq_x_n_u32:
16257 Param0 = 1;
16258 Param1 = Intrinsic::arm_mve_hsub_predicated;
16259 break;
16260 }
16261 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16262 Value *Val1 = UndefValue::get(Val0);
16263 Value *Val2 = EmitScalarExpr(E->getArg(0));
16264 Value *Val3 = EmitScalarExpr(E->getArg(1));
16265 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
16266 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
16267 Value *Val6 = EmitScalarExpr(E->getArg(2));
16268 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
16269 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
16270 return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val4, Val5, Val8, Val1});
16271 }
16272 case ARM::BI__builtin_arm_mve_vabsq_x_s32:
16273 case ARM::BI__builtin_arm_mve_vclsq_x_s32:
16274 case ARM::BI__builtin_arm_mve_vclzq_x_s32:
16275 case ARM::BI__builtin_arm_mve_vclzq_x_u32:
16276 case ARM::BI__builtin_arm_mve_vmvnq_x_s32:
16277 case ARM::BI__builtin_arm_mve_vmvnq_x_u32:
16278 case ARM::BI__builtin_arm_mve_vnegq_x_s32: {
16279 Intrinsic::ID Param0;
16280 switch (BuiltinID) {
16281 case ARM::BI__builtin_arm_mve_vabsq_x_s32:
16282 Param0 = Intrinsic::arm_mve_abs_predicated;
16283 break;
16284 case ARM::BI__builtin_arm_mve_vclsq_x_s32:
16285 Param0 = Intrinsic::arm_mve_cls_predicated;
16286 break;
16287 case ARM::BI__builtin_arm_mve_vclzq_x_s32:
16288 Param0 = Intrinsic::arm_mve_clz_predicated;
16289 break;
16290 case ARM::BI__builtin_arm_mve_vclzq_x_u32:
16291 Param0 = Intrinsic::arm_mve_clz_predicated;
16292 break;
16293 case ARM::BI__builtin_arm_mve_vmvnq_x_s32:
16294 Param0 = Intrinsic::arm_mve_mvn_predicated;
16295 break;
16296 case ARM::BI__builtin_arm_mve_vmvnq_x_u32:
16297 Param0 = Intrinsic::arm_mve_mvn_predicated;
16298 break;
16299 case ARM::BI__builtin_arm_mve_vnegq_x_s32:
16300 Param0 = Intrinsic::arm_mve_neg_predicated;
16301 break;
16302 }
16303 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16304 Value *Val1 = UndefValue::get(Val0);
16305 Value *Val2 = EmitScalarExpr(E->getArg(0));
16306 Value *Val3 = EmitScalarExpr(E->getArg(1));
16307 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
16308 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4});
16309 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val5, Val1});
16310 }
16311 case ARM::BI__builtin_arm_mve_vddupq_x_n_u32:
16312 case ARM::BI__builtin_arm_mve_vidupq_x_n_u32: {
16313 Intrinsic::ID Param0;
16314 switch (BuiltinID) {
16315 case ARM::BI__builtin_arm_mve_vddupq_x_n_u32:
16316 Param0 = Intrinsic::arm_mve_vddup_predicated;
16317 break;
16318 case ARM::BI__builtin_arm_mve_vidupq_x_n_u32:
16319 Param0 = Intrinsic::arm_mve_vidup_predicated;
16320 break;
16321 }
16322 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16323 Value *Val1 = UndefValue::get(Val0);
16324 Value *Val2 = EmitScalarExpr(E->getArg(0));
16325 Value *Val3 = EmitScalarExpr(E->getArg(1));
16326 Value *Val4 = EmitScalarExpr(E->getArg(2));
16327 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16328 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16329 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val6});
16330 return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
16331 }
16332 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s32:
16333 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u32: {
16334 Intrinsic::ID Param0;
16335 switch (BuiltinID) {
16336 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s32:
16337 Param0 = Intrinsic::arm_mve_vbrsr_predicated;
16338 break;
16339 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u32:
16340 Param0 = Intrinsic::arm_mve_vbrsr_predicated;
16341 break;
16342 }
16343 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16344 Value *Val1 = UndefValue::get(Val0);
16345 Value *Val2 = EmitScalarExpr(E->getArg(0));
16346 Value *Val3 = EmitScalarExpr(E->getArg(1));
16347 Value *Val4 = EmitScalarExpr(E->getArg(2));
16348 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16349 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16350 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val6});
16351 }
16352 case ARM::BI__builtin_arm_mve_vaddq_x_s32:
16353 case ARM::BI__builtin_arm_mve_vaddq_x_u32:
16354 case ARM::BI__builtin_arm_mve_vmulq_x_s32:
16355 case ARM::BI__builtin_arm_mve_vmulq_x_u32:
16356 case ARM::BI__builtin_arm_mve_vshlq_x_n_s32:
16357 case ARM::BI__builtin_arm_mve_vshlq_x_n_u32:
16358 case ARM::BI__builtin_arm_mve_vsubq_x_s32:
16359 case ARM::BI__builtin_arm_mve_vsubq_x_u32: {
16360 Intrinsic::ID Param0;
16361 switch (BuiltinID) {
16362 case ARM::BI__builtin_arm_mve_vaddq_x_s32:
16363 Param0 = Intrinsic::arm_mve_add_predicated;
16364 break;
16365 case ARM::BI__builtin_arm_mve_vaddq_x_u32:
16366 Param0 = Intrinsic::arm_mve_add_predicated;
16367 break;
16368 case ARM::BI__builtin_arm_mve_vmulq_x_s32:
16369 Param0 = Intrinsic::arm_mve_mul_predicated;
16370 break;
16371 case ARM::BI__builtin_arm_mve_vmulq_x_u32:
16372 Param0 = Intrinsic::arm_mve_mul_predicated;
16373 break;
16374 case ARM::BI__builtin_arm_mve_vshlq_x_n_s32:
16375 Param0 = Intrinsic::arm_mve_shl_imm_predicated;
16376 break;
16377 case ARM::BI__builtin_arm_mve_vshlq_x_n_u32:
16378 Param0 = Intrinsic::arm_mve_shl_imm_predicated;
16379 break;
16380 case ARM::BI__builtin_arm_mve_vsubq_x_s32:
16381 Param0 = Intrinsic::arm_mve_sub_predicated;
16382 break;
16383 case ARM::BI__builtin_arm_mve_vsubq_x_u32:
16384 Param0 = Intrinsic::arm_mve_sub_predicated;
16385 break;
16386 }
16387 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16388 Value *Val1 = UndefValue::get(Val0);
16389 Value *Val2 = EmitScalarExpr(E->getArg(0));
16390 Value *Val3 = EmitScalarExpr(E->getArg(1));
16391 Value *Val4 = EmitScalarExpr(E->getArg(2));
16392 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16393 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16394 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
16395 }
16396 case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u32:
16397 case ARM::BI__builtin_arm_mve_viwdupq_x_n_u32: {
16398 Intrinsic::ID Param0;
16399 switch (BuiltinID) {
16400 case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u32:
16401 Param0 = Intrinsic::arm_mve_vdwdup_predicated;
16402 break;
16403 case ARM::BI__builtin_arm_mve_viwdupq_x_n_u32:
16404 Param0 = Intrinsic::arm_mve_viwdup_predicated;
16405 break;
16406 }
16407 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16408 Value *Val1 = UndefValue::get(Val0);
16409 Value *Val2 = EmitScalarExpr(E->getArg(0));
16410 Value *Val3 = EmitScalarExpr(E->getArg(1));
16411 Value *Val4 = EmitScalarExpr(E->getArg(2));
16412 Value *Val5 = EmitScalarExpr(E->getArg(3));
16413 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16414 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16415 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val1, Val2, Val3, Val4, Val7});
16416 return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
16417 }
16418 case ARM::BI__builtin_arm_mve_vrshlq_x_s32:
16419 case ARM::BI__builtin_arm_mve_vrshlq_x_u32:
16420 case ARM::BI__builtin_arm_mve_vshlq_x_s32:
16421 case ARM::BI__builtin_arm_mve_vshlq_x_u32: {
16422 uint32_t Param0;
16423 uint32_t Param1;
16424 switch (BuiltinID) {
16425 case ARM::BI__builtin_arm_mve_vrshlq_x_s32:
16426 Param0 = 1;
16427 Param1 = 0;
16428 break;
16429 case ARM::BI__builtin_arm_mve_vrshlq_x_u32:
16430 Param0 = 1;
16431 Param1 = 1;
16432 break;
16433 case ARM::BI__builtin_arm_mve_vshlq_x_s32:
16434 Param0 = 0;
16435 Param1 = 0;
16436 break;
16437 case ARM::BI__builtin_arm_mve_vshlq_x_u32:
16438 Param0 = 0;
16439 Param1 = 1;
16440 break;
16441 }
16442 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16443 Value *Val1 = UndefValue::get(Val0);
16444 Value *Val2 = EmitScalarExpr(E->getArg(0));
16445 Value *Val3 = EmitScalarExpr(E->getArg(1));
16446 Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
16447 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
16448 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
16449 Value *Val7 = EmitScalarExpr(E->getArg(2));
16450 Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
16451 Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val8});
16452 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_vector_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val5, Val6, Val9, Val1});
16453 }
16454 case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p16:
16455 case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p16: {
16456 uint32_t Param0;
16457 switch (BuiltinID) {
16458 case ARM::BI__builtin_arm_mve_vmullbq_poly_x_p16:
16459 Param0 = 0;
16460 break;
16461 case ARM::BI__builtin_arm_mve_vmulltq_poly_x_p16:
16462 Param0 = 1;
16463 break;
16464 }
16465 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16466 Value *Val1 = UndefValue::get(Val0);
16467 Value *Val2 = EmitScalarExpr(E->getArg(0));
16468 Value *Val3 = EmitScalarExpr(E->getArg(1));
16469 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
16470 Value *Val5 = EmitScalarExpr(E->getArg(2));
16471 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16472 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16473 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_mull_poly_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val7, Val1});
16474 }
16475 case ARM::BI__builtin_arm_mve_vabdq_x_s32:
16476 case ARM::BI__builtin_arm_mve_vabdq_x_u32:
16477 case ARM::BI__builtin_arm_mve_vhaddq_x_s32:
16478 case ARM::BI__builtin_arm_mve_vhaddq_x_u32:
16479 case ARM::BI__builtin_arm_mve_vhsubq_x_s32:
16480 case ARM::BI__builtin_arm_mve_vhsubq_x_u32:
16481 case ARM::BI__builtin_arm_mve_vmaxq_x_s32:
16482 case ARM::BI__builtin_arm_mve_vmaxq_x_u32:
16483 case ARM::BI__builtin_arm_mve_vminq_x_s32:
16484 case ARM::BI__builtin_arm_mve_vminq_x_u32:
16485 case ARM::BI__builtin_arm_mve_vmulhq_x_s32:
16486 case ARM::BI__builtin_arm_mve_vmulhq_x_u32:
16487 case ARM::BI__builtin_arm_mve_vrhaddq_x_s32:
16488 case ARM::BI__builtin_arm_mve_vrhaddq_x_u32:
16489 case ARM::BI__builtin_arm_mve_vrmulhq_x_s32:
16490 case ARM::BI__builtin_arm_mve_vrmulhq_x_u32:
16491 case ARM::BI__builtin_arm_mve_vrshrq_x_n_s32:
16492 case ARM::BI__builtin_arm_mve_vrshrq_x_n_u32:
16493 case ARM::BI__builtin_arm_mve_vshrq_x_n_s32:
16494 case ARM::BI__builtin_arm_mve_vshrq_x_n_u32: {
16495 uint32_t Param0;
16496 Intrinsic::ID Param1;
16497 switch (BuiltinID) {
16498 case ARM::BI__builtin_arm_mve_vabdq_x_s32:
16499 Param0 = 0;
16500 Param1 = Intrinsic::arm_mve_abd_predicated;
16501 break;
16502 case ARM::BI__builtin_arm_mve_vabdq_x_u32:
16503 Param0 = 1;
16504 Param1 = Intrinsic::arm_mve_abd_predicated;
16505 break;
16506 case ARM::BI__builtin_arm_mve_vhaddq_x_s32:
16507 Param0 = 0;
16508 Param1 = Intrinsic::arm_mve_hadd_predicated;
16509 break;
16510 case ARM::BI__builtin_arm_mve_vhaddq_x_u32:
16511 Param0 = 1;
16512 Param1 = Intrinsic::arm_mve_hadd_predicated;
16513 break;
16514 case ARM::BI__builtin_arm_mve_vhsubq_x_s32:
16515 Param0 = 0;
16516 Param1 = Intrinsic::arm_mve_hsub_predicated;
16517 break;
16518 case ARM::BI__builtin_arm_mve_vhsubq_x_u32:
16519 Param0 = 1;
16520 Param1 = Intrinsic::arm_mve_hsub_predicated;
16521 break;
16522 case ARM::BI__builtin_arm_mve_vmaxq_x_s32:
16523 Param0 = 0;
16524 Param1 = Intrinsic::arm_mve_max_predicated;
16525 break;
16526 case ARM::BI__builtin_arm_mve_vmaxq_x_u32:
16527 Param0 = 1;
16528 Param1 = Intrinsic::arm_mve_max_predicated;
16529 break;
16530 case ARM::BI__builtin_arm_mve_vminq_x_s32:
16531 Param0 = 0;
16532 Param1 = Intrinsic::arm_mve_min_predicated;
16533 break;
16534 case ARM::BI__builtin_arm_mve_vminq_x_u32:
16535 Param0 = 1;
16536 Param1 = Intrinsic::arm_mve_min_predicated;
16537 break;
16538 case ARM::BI__builtin_arm_mve_vmulhq_x_s32:
16539 Param0 = 0;
16540 Param1 = Intrinsic::arm_mve_mulh_predicated;
16541 break;
16542 case ARM::BI__builtin_arm_mve_vmulhq_x_u32:
16543 Param0 = 1;
16544 Param1 = Intrinsic::arm_mve_mulh_predicated;
16545 break;
16546 case ARM::BI__builtin_arm_mve_vrhaddq_x_s32:
16547 Param0 = 0;
16548 Param1 = Intrinsic::arm_mve_rhadd_predicated;
16549 break;
16550 case ARM::BI__builtin_arm_mve_vrhaddq_x_u32:
16551 Param0 = 1;
16552 Param1 = Intrinsic::arm_mve_rhadd_predicated;
16553 break;
16554 case ARM::BI__builtin_arm_mve_vrmulhq_x_s32:
16555 Param0 = 0;
16556 Param1 = Intrinsic::arm_mve_rmulh_predicated;
16557 break;
16558 case ARM::BI__builtin_arm_mve_vrmulhq_x_u32:
16559 Param0 = 1;
16560 Param1 = Intrinsic::arm_mve_rmulh_predicated;
16561 break;
16562 case ARM::BI__builtin_arm_mve_vrshrq_x_n_s32:
16563 Param0 = 0;
16564 Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
16565 break;
16566 case ARM::BI__builtin_arm_mve_vrshrq_x_n_u32:
16567 Param0 = 1;
16568 Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
16569 break;
16570 case ARM::BI__builtin_arm_mve_vshrq_x_n_s32:
16571 Param0 = 0;
16572 Param1 = Intrinsic::arm_mve_shr_imm_predicated;
16573 break;
16574 case ARM::BI__builtin_arm_mve_vshrq_x_n_u32:
16575 Param0 = 1;
16576 Param1 = Intrinsic::arm_mve_shr_imm_predicated;
16577 break;
16578 }
16579 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16580 Value *Val1 = UndefValue::get(Val0);
16581 Value *Val2 = EmitScalarExpr(E->getArg(0));
16582 Value *Val3 = EmitScalarExpr(E->getArg(1));
16583 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
16584 Value *Val5 = EmitScalarExpr(E->getArg(2));
16585 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16586 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16587 return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val7, Val1});
16588 }
16589 case ARM::BI__builtin_arm_mve_vmullbq_int_x_s16:
16590 case ARM::BI__builtin_arm_mve_vmullbq_int_x_u16:
16591 case ARM::BI__builtin_arm_mve_vmulltq_int_x_s16:
16592 case ARM::BI__builtin_arm_mve_vmulltq_int_x_u16:
16593 case ARM::BI__builtin_arm_mve_vshllbq_x_n_s16:
16594 case ARM::BI__builtin_arm_mve_vshllbq_x_n_u16:
16595 case ARM::BI__builtin_arm_mve_vshlltq_x_n_s16:
16596 case ARM::BI__builtin_arm_mve_vshlltq_x_n_u16: {
16597 uint32_t Param0;
16598 uint32_t Param1;
16599 Intrinsic::ID Param2;
16600 switch (BuiltinID) {
16601 case ARM::BI__builtin_arm_mve_vmullbq_int_x_s16:
16602 Param0 = 0;
16603 Param1 = 0;
16604 Param2 = Intrinsic::arm_mve_mull_int_predicated;
16605 break;
16606 case ARM::BI__builtin_arm_mve_vmullbq_int_x_u16:
16607 Param0 = 1;
16608 Param1 = 0;
16609 Param2 = Intrinsic::arm_mve_mull_int_predicated;
16610 break;
16611 case ARM::BI__builtin_arm_mve_vmulltq_int_x_s16:
16612 Param0 = 0;
16613 Param1 = 1;
16614 Param2 = Intrinsic::arm_mve_mull_int_predicated;
16615 break;
16616 case ARM::BI__builtin_arm_mve_vmulltq_int_x_u16:
16617 Param0 = 1;
16618 Param1 = 1;
16619 Param2 = Intrinsic::arm_mve_mull_int_predicated;
16620 break;
16621 case ARM::BI__builtin_arm_mve_vshllbq_x_n_s16:
16622 Param0 = 0;
16623 Param1 = 0;
16624 Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
16625 break;
16626 case ARM::BI__builtin_arm_mve_vshllbq_x_n_u16:
16627 Param0 = 1;
16628 Param1 = 0;
16629 Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
16630 break;
16631 case ARM::BI__builtin_arm_mve_vshlltq_x_n_s16:
16632 Param0 = 0;
16633 Param1 = 1;
16634 Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
16635 break;
16636 case ARM::BI__builtin_arm_mve_vshlltq_x_n_u16:
16637 Param0 = 1;
16638 Param1 = 1;
16639 Param2 = Intrinsic::arm_mve_vshll_imm_predicated;
16640 break;
16641 }
16642 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16643 Value *Val1 = UndefValue::get(Val0);
16644 Value *Val2 = EmitScalarExpr(E->getArg(0));
16645 Value *Val3 = EmitScalarExpr(E->getArg(1));
16646 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
16647 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
16648 Value *Val6 = EmitScalarExpr(E->getArg(2));
16649 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
16650 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
16651 return Builder.CreateCall(CGM.getIntrinsic(Param2, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val5, Val8, Val1});
16652 }
16653 case ARM::BI__builtin_arm_mve_vrev64q_x_s32:
16654 case ARM::BI__builtin_arm_mve_vrev64q_x_u32: {
16655 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16656 Value *Val1 = UndefValue::get(Val0);
16657 Value *Val2 = EmitScalarExpr(E->getArg(0));
16658 Value *Val3 = llvm::ConstantInt::get(Int32Ty, 64);
16659 Value *Val4 = EmitScalarExpr(E->getArg(1));
16660 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16661 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16662 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
16663 }
16664 case ARM::BI__builtin_arm_mve_vcvtq_x_s32_f32:
16665 case ARM::BI__builtin_arm_mve_vcvtq_x_u32_f32: {
16666 uint32_t Param0;
16667 switch (BuiltinID) {
16668 case ARM::BI__builtin_arm_mve_vcvtq_x_s32_f32:
16669 Param0 = 0;
16670 break;
16671 case ARM::BI__builtin_arm_mve_vcvtq_x_u32_f32:
16672 Param0 = 1;
16673 break;
16674 }
16675 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16676 Value *Val1 = UndefValue::get(Val0);
16677 Value *Val2 = EmitScalarExpr(E->getArg(0));
16678 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
16679 Value *Val4 = EmitScalarExpr(E->getArg(1));
16680 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16681 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16682 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fp_int_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val6, Val1});
16683 }
16684 case ARM::BI__builtin_arm_mve_vmovlbq_x_s16:
16685 case ARM::BI__builtin_arm_mve_vmovlbq_x_u16:
16686 case ARM::BI__builtin_arm_mve_vmovltq_x_s16:
16687 case ARM::BI__builtin_arm_mve_vmovltq_x_u16: {
16688 uint32_t Param0;
16689 uint32_t Param1;
16690 switch (BuiltinID) {
16691 case ARM::BI__builtin_arm_mve_vmovlbq_x_s16:
16692 Param0 = 0;
16693 Param1 = 0;
16694 break;
16695 case ARM::BI__builtin_arm_mve_vmovlbq_x_u16:
16696 Param0 = 1;
16697 Param1 = 0;
16698 break;
16699 case ARM::BI__builtin_arm_mve_vmovltq_x_s16:
16700 Param0 = 0;
16701 Param1 = 1;
16702 break;
16703 case ARM::BI__builtin_arm_mve_vmovltq_x_u16:
16704 Param0 = 1;
16705 Param1 = 1;
16706 break;
16707 }
16708 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16709 Value *Val1 = UndefValue::get(Val0);
16710 Value *Val2 = EmitScalarExpr(E->getArg(0));
16711 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
16712 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param1);
16713 Value *Val5 = EmitScalarExpr(E->getArg(1));
16714 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16715 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16716 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vmovl_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Int16Ty, 8), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val4, Val7, Val1});
16717 }
16718 case ARM::BI__builtin_arm_mve_vandq_x_s32:
16719 case ARM::BI__builtin_arm_mve_vandq_x_u32:
16720 case ARM::BI__builtin_arm_mve_vbicq_x_s32:
16721 case ARM::BI__builtin_arm_mve_vbicq_x_u32:
16722 case ARM::BI__builtin_arm_mve_veorq_x_s32:
16723 case ARM::BI__builtin_arm_mve_veorq_x_u32:
16724 case ARM::BI__builtin_arm_mve_vornq_x_s32:
16725 case ARM::BI__builtin_arm_mve_vornq_x_u32:
16726 case ARM::BI__builtin_arm_mve_vorrq_x_s32:
16727 case ARM::BI__builtin_arm_mve_vorrq_x_u32: {
16728 Intrinsic::ID Param0;
16729 switch (BuiltinID) {
16730 case ARM::BI__builtin_arm_mve_vandq_x_s32:
16731 Param0 = Intrinsic::arm_mve_and_predicated;
16732 break;
16733 case ARM::BI__builtin_arm_mve_vandq_x_u32:
16734 Param0 = Intrinsic::arm_mve_and_predicated;
16735 break;
16736 case ARM::BI__builtin_arm_mve_vbicq_x_s32:
16737 Param0 = Intrinsic::arm_mve_bic_predicated;
16738 break;
16739 case ARM::BI__builtin_arm_mve_vbicq_x_u32:
16740 Param0 = Intrinsic::arm_mve_bic_predicated;
16741 break;
16742 case ARM::BI__builtin_arm_mve_veorq_x_s32:
16743 Param0 = Intrinsic::arm_mve_eor_predicated;
16744 break;
16745 case ARM::BI__builtin_arm_mve_veorq_x_u32:
16746 Param0 = Intrinsic::arm_mve_eor_predicated;
16747 break;
16748 case ARM::BI__builtin_arm_mve_vornq_x_s32:
16749 Param0 = Intrinsic::arm_mve_orn_predicated;
16750 break;
16751 case ARM::BI__builtin_arm_mve_vornq_x_u32:
16752 Param0 = Intrinsic::arm_mve_orn_predicated;
16753 break;
16754 case ARM::BI__builtin_arm_mve_vorrq_x_s32:
16755 Param0 = Intrinsic::arm_mve_orr_predicated;
16756 break;
16757 case ARM::BI__builtin_arm_mve_vorrq_x_u32:
16758 Param0 = Intrinsic::arm_mve_orr_predicated;
16759 break;
16760 }
16761 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16762 Value *Val1 = UndefValue::get(Val0);
16763 Value *Val2 = EmitScalarExpr(E->getArg(0));
16764 llvm::Type *Val3 = llvm::FixedVectorType::get(Int32Ty, 4);
16765 Value *Val4 = Builder.CreateBitCast(Val2, Val3);
16766 Value *Val5 = EmitScalarExpr(E->getArg(1));
16767 llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
16768 Value *Val7 = Builder.CreateBitCast(Val5, Val6);
16769 Value *Val8 = EmitScalarExpr(E->getArg(2));
16770 Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
16771 Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val9});
16772 llvm::Type *Val11 = llvm::FixedVectorType::get(Int32Ty, 4);
16773 Value *Val12 = Builder.CreateBitCast(Val1, Val11);
16774 Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val4, Val7, Val10, Val12});
16775 llvm::Type *Val14 = llvm::FixedVectorType::get(Int32Ty, 4);
16776 return Builder.CreateBitCast(Val13, Val14);
16777 }
16778 case ARM::BI__builtin_arm_mve_vdupq_x_n_s32:
16779 case ARM::BI__builtin_arm_mve_vdupq_x_n_u32: {
16780 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16781 Value *Val1 = UndefValue::get(Val0);
16782 Value *Val2 = EmitScalarExpr(E->getArg(1));
16783 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
16784 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
16785 Value *Val5 = EmitScalarExpr(E->getArg(0));
16786 Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
16787 return Builder.CreateSelect(Val4, Val6, Val1);
16788 }
16789 case ARM::BI__builtin_arm_mve_vmvnq_x_n_s32:
16790 case ARM::BI__builtin_arm_mve_vmvnq_x_n_u32: {
16791 bool Param0;
16792 switch (BuiltinID) {
16793 case ARM::BI__builtin_arm_mve_vmvnq_x_n_s32:
16794 Param0 = true;
16795 break;
16796 case ARM::BI__builtin_arm_mve_vmvnq_x_n_u32:
16797 Param0 = false;
16798 break;
16799 }
16800 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16801 Value *Val1 = UndefValue::get(Val0);
16802 Value *Val2 = EmitScalarExpr(E->getArg(1));
16803 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
16804 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val3});
16805 Value *Val5 = EmitScalarExpr(E->getArg(0));
16806 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, Param0);
16807 Value *Val7 = ARMMVEVectorSplat(Builder, Val6);
16808 Value *Val8 = Builder.CreateNot(Val7);
16809 return Builder.CreateSelect(Val4, Val8, Val1);
16810 }
16811 case ARM::BI__builtin_arm_mve_vcvtaq_x_s32_f32:
16812 case ARM::BI__builtin_arm_mve_vcvtaq_x_u32_f32:
16813 case ARM::BI__builtin_arm_mve_vcvtmq_x_s32_f32:
16814 case ARM::BI__builtin_arm_mve_vcvtmq_x_u32_f32:
16815 case ARM::BI__builtin_arm_mve_vcvtnq_x_s32_f32:
16816 case ARM::BI__builtin_arm_mve_vcvtnq_x_u32_f32:
16817 case ARM::BI__builtin_arm_mve_vcvtpq_x_s32_f32:
16818 case ARM::BI__builtin_arm_mve_vcvtpq_x_u32_f32: {
16819 uint32_t Param0;
16820 Intrinsic::ID Param1;
16821 switch (BuiltinID) {
16822 case ARM::BI__builtin_arm_mve_vcvtaq_x_s32_f32:
16823 Param0 = 0;
16824 Param1 = Intrinsic::arm_mve_vcvta_predicated;
16825 break;
16826 case ARM::BI__builtin_arm_mve_vcvtaq_x_u32_f32:
16827 Param0 = 1;
16828 Param1 = Intrinsic::arm_mve_vcvta_predicated;
16829 break;
16830 case ARM::BI__builtin_arm_mve_vcvtmq_x_s32_f32:
16831 Param0 = 0;
16832 Param1 = Intrinsic::arm_mve_vcvtm_predicated;
16833 break;
16834 case ARM::BI__builtin_arm_mve_vcvtmq_x_u32_f32:
16835 Param0 = 1;
16836 Param1 = Intrinsic::arm_mve_vcvtm_predicated;
16837 break;
16838 case ARM::BI__builtin_arm_mve_vcvtnq_x_s32_f32:
16839 Param0 = 0;
16840 Param1 = Intrinsic::arm_mve_vcvtn_predicated;
16841 break;
16842 case ARM::BI__builtin_arm_mve_vcvtnq_x_u32_f32:
16843 Param0 = 1;
16844 Param1 = Intrinsic::arm_mve_vcvtn_predicated;
16845 break;
16846 case ARM::BI__builtin_arm_mve_vcvtpq_x_s32_f32:
16847 Param0 = 0;
16848 Param1 = Intrinsic::arm_mve_vcvtp_predicated;
16849 break;
16850 case ARM::BI__builtin_arm_mve_vcvtpq_x_u32_f32:
16851 Param0 = 1;
16852 Param1 = Intrinsic::arm_mve_vcvtp_predicated;
16853 break;
16854 }
16855 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16856 Value *Val1 = UndefValue::get(Val0);
16857 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16858 Value *Val3 = EmitScalarExpr(E->getArg(0));
16859 Value *Val4 = EmitScalarExpr(E->getArg(1));
16860 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
16861 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val5});
16862 return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val1, Val3, Val6});
16863 }
16864 case ARM::BI__builtin_arm_mve_vcvtq_x_n_s32_f32:
16865 case ARM::BI__builtin_arm_mve_vcvtq_x_n_u32_f32: {
16866 uint32_t Param0;
16867 switch (BuiltinID) {
16868 case ARM::BI__builtin_arm_mve_vcvtq_x_n_s32_f32:
16869 Param0 = 0;
16870 break;
16871 case ARM::BI__builtin_arm_mve_vcvtq_x_n_u32_f32:
16872 Param0 = 1;
16873 break;
16874 }
16875 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16876 Value *Val1 = UndefValue::get(Val0);
16877 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16878 Value *Val3 = EmitScalarExpr(E->getArg(0));
16879 Value *Val4 = EmitScalarExpr(E->getArg(1));
16880 Value *Val5 = EmitScalarExpr(E->getArg(2));
16881 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
16882 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val6});
16883 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcvt_fix_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(FloatTy, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val1, Val3, Val4, Val7});
16884 }
16885 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s32:
16886 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u32:
16887 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s32:
16888 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u32:
16889 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s32:
16890 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s32: {
16891 uint32_t Param0;
16892 uint32_t Param1;
16893 switch (BuiltinID) {
16894 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s32:
16895 Param0 = 1;
16896 Param1 = 1;
16897 break;
16898 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u32:
16899 Param0 = 1;
16900 Param1 = 1;
16901 break;
16902 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s32:
16903 Param0 = 1;
16904 Param1 = 0;
16905 break;
16906 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u32:
16907 Param0 = 1;
16908 Param1 = 0;
16909 break;
16910 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s32:
16911 Param0 = 0;
16912 Param1 = 1;
16913 break;
16914 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s32:
16915 Param0 = 0;
16916 Param1 = 0;
16917 break;
16918 }
16919 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16920 Value *Val1 = UndefValue::get(Val0);
16921 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
16922 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
16923 Value *Val4 = EmitScalarExpr(E->getArg(0));
16924 Value *Val5 = EmitScalarExpr(E->getArg(1));
16925 Value *Val6 = EmitScalarExpr(E->getArg(2));
16926 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
16927 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val7});
16928 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 4)}), {Val2, Val3, Val1, Val4, Val5, Val8});
16929 }
16930 case ARM::BI__builtin_arm_mve_vnegq_s32: {
16931 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16932 Value *Val1 = llvm::Constant::getNullValue(Val0);
16933 Value *Val2 = EmitScalarExpr(E->getArg(0));
16934 return Builder.CreateSub(Val1, Val2);
16935 }
16936 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s32:
16937 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u32:
16938 case ARM::BI__builtin_arm_mve_vuninitializedq_s32:
16939 case ARM::BI__builtin_arm_mve_vuninitializedq_u32: {
16940 llvm::Type *Val0 = llvm::FixedVectorType::get(Int32Ty, 4);
16941 return UndefValue::get(Val0);
16942 }
16943 case ARM::BI__builtin_arm_mve_vcreateq_f32: {
16944 llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16945 Value *Val1 = UndefValue::get(Val0);
16946 Value *Val2 = EmitScalarExpr(E->getArg(0));
16947 Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
16948 Value *Val4 = EmitScalarExpr(E->getArg(1));
16949 Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
16950 llvm::Type *Val6 = llvm::FixedVectorType::get(FloatTy, 4);
16951 return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
16952 }
16953 case ARM::BI__builtin_arm_mve_vcreateq_f16: {
16954 llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16955 Value *Val1 = UndefValue::get(Val0);
16956 Value *Val2 = EmitScalarExpr(E->getArg(0));
16957 Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
16958 Value *Val4 = EmitScalarExpr(E->getArg(1));
16959 Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
16960 llvm::Type *Val6 = llvm::FixedVectorType::get(HalfTy, 8);
16961 return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
16962 }
16963 case ARM::BI__builtin_arm_mve_vcreateq_s16:
16964 case ARM::BI__builtin_arm_mve_vcreateq_u16: {
16965 llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16966 Value *Val1 = UndefValue::get(Val0);
16967 Value *Val2 = EmitScalarExpr(E->getArg(0));
16968 Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
16969 Value *Val4 = EmitScalarExpr(E->getArg(1));
16970 Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
16971 llvm::Type *Val6 = llvm::FixedVectorType::get(Int16Ty, 8);
16972 return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
16973 }
16974 case ARM::BI__builtin_arm_mve_vcreateq_s32:
16975 case ARM::BI__builtin_arm_mve_vcreateq_u32: {
16976 llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16977 Value *Val1 = UndefValue::get(Val0);
16978 Value *Val2 = EmitScalarExpr(E->getArg(0));
16979 Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
16980 Value *Val4 = EmitScalarExpr(E->getArg(1));
16981 Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
16982 llvm::Type *Val6 = llvm::FixedVectorType::get(Int32Ty, 4);
16983 return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
16984 }
16985 case ARM::BI__builtin_arm_mve_vcreateq_s64:
16986 case ARM::BI__builtin_arm_mve_vcreateq_u64: {
16987 llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16988 Value *Val1 = UndefValue::get(Val0);
16989 Value *Val2 = EmitScalarExpr(E->getArg(0));
16990 Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
16991 Value *Val4 = EmitScalarExpr(E->getArg(1));
16992 Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
16993 llvm::Type *Val6 = llvm::FixedVectorType::get(Int64Ty, 2);
16994 return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
16995 }
16996 case ARM::BI__builtin_arm_mve_vcreateq_s8:
16997 case ARM::BI__builtin_arm_mve_vcreateq_u8: {
16998 llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
16999 Value *Val1 = UndefValue::get(Val0);
17000 Value *Val2 = EmitScalarExpr(E->getArg(0));
17001 Value *Val3 = Builder.CreateInsertElement(Val1, Val2, static_cast<uint64_t>(0));
17002 Value *Val4 = EmitScalarExpr(E->getArg(1));
17003 Value *Val5 = Builder.CreateInsertElement(Val3, Val4, static_cast<uint64_t>(1));
17004 llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
17005 return ARMMVEVectorReinterpret(Builder, this, Val5, Val6);
17006 }
17007 case ARM::BI__builtin_arm_mve_vmullbq_int_x_s32:
17008 case ARM::BI__builtin_arm_mve_vmullbq_int_x_u32:
17009 case ARM::BI__builtin_arm_mve_vmulltq_int_x_s32:
17010 case ARM::BI__builtin_arm_mve_vmulltq_int_x_u32: {
17011 uint32_t Param0;
17012 uint32_t Param1;
17013 switch (BuiltinID) {
17014 case ARM::BI__builtin_arm_mve_vmullbq_int_x_s32:
17015 Param0 = 0;
17016 Param1 = 0;
17017 break;
17018 case ARM::BI__builtin_arm_mve_vmullbq_int_x_u32:
17019 Param0 = 1;
17020 Param1 = 0;
17021 break;
17022 case ARM::BI__builtin_arm_mve_vmulltq_int_x_s32:
17023 Param0 = 0;
17024 Param1 = 1;
17025 break;
17026 case ARM::BI__builtin_arm_mve_vmulltq_int_x_u32:
17027 Param0 = 1;
17028 Param1 = 1;
17029 break;
17030 }
17031 llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
17032 Value *Val1 = UndefValue::get(Val0);
17033 Value *Val2 = EmitScalarExpr(E->getArg(0));
17034 Value *Val3 = EmitScalarExpr(E->getArg(1));
17035 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
17036 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param1);
17037 Value *Val6 = EmitScalarExpr(E->getArg(2));
17038 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
17039 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 2)}), {Val7});
17040 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_mull_int_predicated, {llvm::FixedVectorType::get(Int64Ty, 2), llvm::FixedVectorType::get(Int32Ty, 4), llvm::FixedVectorType::get(Builder.getInt1Ty(), 2)}), {Val2, Val3, Val4, Val5, Val8, Val1});
17041 }
17042 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s64:
17043 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u64:
17044 case ARM::BI__builtin_arm_mve_vuninitializedq_s64:
17045 case ARM::BI__builtin_arm_mve_vuninitializedq_u64: {
17046 llvm::Type *Val0 = llvm::FixedVectorType::get(Int64Ty, 2);
17047 return UndefValue::get(Val0);
17048 }
17049 case ARM::BI__builtin_arm_mve_vddupq_x_wb_u8:
17050 case ARM::BI__builtin_arm_mve_vidupq_x_wb_u8: {
17051 Intrinsic::ID Param0;
17052 switch (BuiltinID) {
17053 case ARM::BI__builtin_arm_mve_vddupq_x_wb_u8:
17054 Param0 = Intrinsic::arm_mve_vddup_predicated;
17055 break;
17056 case ARM::BI__builtin_arm_mve_vidupq_x_wb_u8:
17057 Param0 = Intrinsic::arm_mve_vidup_predicated;
17058 break;
17059 }
17060 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17061 Value *Val1 = UndefValue::get(Val0);
17062 Address Val2 = EmitPointerWithAlignment(E->getArg(0));
17063 Value *Val3 = Builder.CreateLoad(Val2);
17064 Value *Val4 = EmitScalarExpr(E->getArg(1));
17065 Value *Val5 = EmitScalarExpr(E->getArg(2));
17066 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
17067 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
17068 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val3, Val4, Val7});
17069 Value *Val9 = Builder.CreateExtractValue(Val8, static_cast<unsigned>(1));
17070 Builder.CreateStore(Val9, Val2);
17071 return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
17072 }
17073 case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u8:
17074 case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u8: {
17075 Intrinsic::ID Param0;
17076 switch (BuiltinID) {
17077 case ARM::BI__builtin_arm_mve_vdwdupq_x_wb_u8:
17078 Param0 = Intrinsic::arm_mve_vdwdup_predicated;
17079 break;
17080 case ARM::BI__builtin_arm_mve_viwdupq_x_wb_u8:
17081 Param0 = Intrinsic::arm_mve_viwdup_predicated;
17082 break;
17083 }
17084 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17085 Value *Val1 = UndefValue::get(Val0);
17086 Address Val2 = EmitPointerWithAlignment(E->getArg(0));
17087 Value *Val3 = Builder.CreateLoad(Val2);
17088 Value *Val4 = EmitScalarExpr(E->getArg(1));
17089 Value *Val5 = EmitScalarExpr(E->getArg(2));
17090 Value *Val6 = EmitScalarExpr(E->getArg(3));
17091 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
17092 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
17093 Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val3, Val4, Val5, Val8});
17094 Value *Val10 = Builder.CreateExtractValue(Val9, static_cast<unsigned>(1));
17095 Builder.CreateStore(Val10, Val2);
17096 return Builder.CreateExtractValue(Val9, static_cast<unsigned>(0));
17097 }
17098 case ARM::BI__builtin_arm_mve_vaddq_x_n_s8:
17099 case ARM::BI__builtin_arm_mve_vaddq_x_n_u8:
17100 case ARM::BI__builtin_arm_mve_vmulq_x_n_s8:
17101 case ARM::BI__builtin_arm_mve_vmulq_x_n_u8:
17102 case ARM::BI__builtin_arm_mve_vsubq_x_n_s8:
17103 case ARM::BI__builtin_arm_mve_vsubq_x_n_u8: {
17104 Intrinsic::ID Param0;
17105 switch (BuiltinID) {
17106 case ARM::BI__builtin_arm_mve_vaddq_x_n_s8:
17107 Param0 = Intrinsic::arm_mve_add_predicated;
17108 break;
17109 case ARM::BI__builtin_arm_mve_vaddq_x_n_u8:
17110 Param0 = Intrinsic::arm_mve_add_predicated;
17111 break;
17112 case ARM::BI__builtin_arm_mve_vmulq_x_n_s8:
17113 Param0 = Intrinsic::arm_mve_mul_predicated;
17114 break;
17115 case ARM::BI__builtin_arm_mve_vmulq_x_n_u8:
17116 Param0 = Intrinsic::arm_mve_mul_predicated;
17117 break;
17118 case ARM::BI__builtin_arm_mve_vsubq_x_n_s8:
17119 Param0 = Intrinsic::arm_mve_sub_predicated;
17120 break;
17121 case ARM::BI__builtin_arm_mve_vsubq_x_n_u8:
17122 Param0 = Intrinsic::arm_mve_sub_predicated;
17123 break;
17124 }
17125 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17126 Value *Val1 = UndefValue::get(Val0);
17127 Value *Val2 = EmitScalarExpr(E->getArg(0));
17128 Value *Val3 = EmitScalarExpr(E->getArg(1));
17129 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
17130 Value *Val5 = EmitScalarExpr(E->getArg(2));
17131 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
17132 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
17133 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val4, Val7, Val1});
17134 }
17135 case ARM::BI__builtin_arm_mve_vhaddq_x_n_s8:
17136 case ARM::BI__builtin_arm_mve_vhaddq_x_n_u8:
17137 case ARM::BI__builtin_arm_mve_vhsubq_x_n_s8:
17138 case ARM::BI__builtin_arm_mve_vhsubq_x_n_u8: {
17139 uint32_t Param0;
17140 Intrinsic::ID Param1;
17141 switch (BuiltinID) {
17142 case ARM::BI__builtin_arm_mve_vhaddq_x_n_s8:
17143 Param0 = 0;
17144 Param1 = Intrinsic::arm_mve_hadd_predicated;
17145 break;
17146 case ARM::BI__builtin_arm_mve_vhaddq_x_n_u8:
17147 Param0 = 1;
17148 Param1 = Intrinsic::arm_mve_hadd_predicated;
17149 break;
17150 case ARM::BI__builtin_arm_mve_vhsubq_x_n_s8:
17151 Param0 = 0;
17152 Param1 = Intrinsic::arm_mve_hsub_predicated;
17153 break;
17154 case ARM::BI__builtin_arm_mve_vhsubq_x_n_u8:
17155 Param0 = 1;
17156 Param1 = Intrinsic::arm_mve_hsub_predicated;
17157 break;
17158 }
17159 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17160 Value *Val1 = UndefValue::get(Val0);
17161 Value *Val2 = EmitScalarExpr(E->getArg(0));
17162 Value *Val3 = EmitScalarExpr(E->getArg(1));
17163 Value *Val4 = ARMMVEVectorSplat(Builder, Val3);
17164 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
17165 Value *Val6 = EmitScalarExpr(E->getArg(2));
17166 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
17167 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
17168 return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val4, Val5, Val8, Val1});
17169 }
17170 case ARM::BI__builtin_arm_mve_vabsq_x_s8:
17171 case ARM::BI__builtin_arm_mve_vclsq_x_s8:
17172 case ARM::BI__builtin_arm_mve_vclzq_x_s8:
17173 case ARM::BI__builtin_arm_mve_vclzq_x_u8:
17174 case ARM::BI__builtin_arm_mve_vmvnq_x_s8:
17175 case ARM::BI__builtin_arm_mve_vmvnq_x_u8:
17176 case ARM::BI__builtin_arm_mve_vnegq_x_s8: {
17177 Intrinsic::ID Param0;
17178 switch (BuiltinID) {
17179 case ARM::BI__builtin_arm_mve_vabsq_x_s8:
17180 Param0 = Intrinsic::arm_mve_abs_predicated;
17181 break;
17182 case ARM::BI__builtin_arm_mve_vclsq_x_s8:
17183 Param0 = Intrinsic::arm_mve_cls_predicated;
17184 break;
17185 case ARM::BI__builtin_arm_mve_vclzq_x_s8:
17186 Param0 = Intrinsic::arm_mve_clz_predicated;
17187 break;
17188 case ARM::BI__builtin_arm_mve_vclzq_x_u8:
17189 Param0 = Intrinsic::arm_mve_clz_predicated;
17190 break;
17191 case ARM::BI__builtin_arm_mve_vmvnq_x_s8:
17192 Param0 = Intrinsic::arm_mve_mvn_predicated;
17193 break;
17194 case ARM::BI__builtin_arm_mve_vmvnq_x_u8:
17195 Param0 = Intrinsic::arm_mve_mvn_predicated;
17196 break;
17197 case ARM::BI__builtin_arm_mve_vnegq_x_s8:
17198 Param0 = Intrinsic::arm_mve_neg_predicated;
17199 break;
17200 }
17201 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17202 Value *Val1 = UndefValue::get(Val0);
17203 Value *Val2 = EmitScalarExpr(E->getArg(0));
17204 Value *Val3 = EmitScalarExpr(E->getArg(1));
17205 Value *Val4 = Builder.CreateIntCast(Val3, Int32Ty, false);
17206 Value *Val5 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val4});
17207 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val5, Val1});
17208 }
17209 case ARM::BI__builtin_arm_mve_vddupq_x_n_u8:
17210 case ARM::BI__builtin_arm_mve_vidupq_x_n_u8: {
17211 Intrinsic::ID Param0;
17212 switch (BuiltinID) {
17213 case ARM::BI__builtin_arm_mve_vddupq_x_n_u8:
17214 Param0 = Intrinsic::arm_mve_vddup_predicated;
17215 break;
17216 case ARM::BI__builtin_arm_mve_vidupq_x_n_u8:
17217 Param0 = Intrinsic::arm_mve_vidup_predicated;
17218 break;
17219 }
17220 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17221 Value *Val1 = UndefValue::get(Val0);
17222 Value *Val2 = EmitScalarExpr(E->getArg(0));
17223 Value *Val3 = EmitScalarExpr(E->getArg(1));
17224 Value *Val4 = EmitScalarExpr(E->getArg(2));
17225 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
17226 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
17227 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val2, Val3, Val6});
17228 return Builder.CreateExtractValue(Val7, static_cast<unsigned>(0));
17229 }
17230 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s8:
17231 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u8: {
17232 Intrinsic::ID Param0;
17233 switch (BuiltinID) {
17234 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_s8:
17235 Param0 = Intrinsic::arm_mve_vbrsr_predicated;
17236 break;
17237 case ARM::BI__builtin_arm_mve_vbrsrq_x_n_u8:
17238 Param0 = Intrinsic::arm_mve_vbrsr_predicated;
17239 break;
17240 }
17241 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17242 Value *Val1 = UndefValue::get(Val0);
17243 Value *Val2 = EmitScalarExpr(E->getArg(0));
17244 Value *Val3 = EmitScalarExpr(E->getArg(1));
17245 Value *Val4 = EmitScalarExpr(E->getArg(2));
17246 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
17247 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
17248 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val2, Val3, Val6});
17249 }
17250 case ARM::BI__builtin_arm_mve_vaddq_x_s8:
17251 case ARM::BI__builtin_arm_mve_vaddq_x_u8:
17252 case ARM::BI__builtin_arm_mve_vmulq_x_s8:
17253 case ARM::BI__builtin_arm_mve_vmulq_x_u8:
17254 case ARM::BI__builtin_arm_mve_vshlq_x_n_s8:
17255 case ARM::BI__builtin_arm_mve_vshlq_x_n_u8:
17256 case ARM::BI__builtin_arm_mve_vsubq_x_s8:
17257 case ARM::BI__builtin_arm_mve_vsubq_x_u8: {
17258 Intrinsic::ID Param0;
17259 switch (BuiltinID) {
17260 case ARM::BI__builtin_arm_mve_vaddq_x_s8:
17261 Param0 = Intrinsic::arm_mve_add_predicated;
17262 break;
17263 case ARM::BI__builtin_arm_mve_vaddq_x_u8:
17264 Param0 = Intrinsic::arm_mve_add_predicated;
17265 break;
17266 case ARM::BI__builtin_arm_mve_vmulq_x_s8:
17267 Param0 = Intrinsic::arm_mve_mul_predicated;
17268 break;
17269 case ARM::BI__builtin_arm_mve_vmulq_x_u8:
17270 Param0 = Intrinsic::arm_mve_mul_predicated;
17271 break;
17272 case ARM::BI__builtin_arm_mve_vshlq_x_n_s8:
17273 Param0 = Intrinsic::arm_mve_shl_imm_predicated;
17274 break;
17275 case ARM::BI__builtin_arm_mve_vshlq_x_n_u8:
17276 Param0 = Intrinsic::arm_mve_shl_imm_predicated;
17277 break;
17278 case ARM::BI__builtin_arm_mve_vsubq_x_s8:
17279 Param0 = Intrinsic::arm_mve_sub_predicated;
17280 break;
17281 case ARM::BI__builtin_arm_mve_vsubq_x_u8:
17282 Param0 = Intrinsic::arm_mve_sub_predicated;
17283 break;
17284 }
17285 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17286 Value *Val1 = UndefValue::get(Val0);
17287 Value *Val2 = EmitScalarExpr(E->getArg(0));
17288 Value *Val3 = EmitScalarExpr(E->getArg(1));
17289 Value *Val4 = EmitScalarExpr(E->getArg(2));
17290 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
17291 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
17292 return Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val6, Val1});
17293 }
17294 case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u8:
17295 case ARM::BI__builtin_arm_mve_viwdupq_x_n_u8: {
17296 Intrinsic::ID Param0;
17297 switch (BuiltinID) {
17298 case ARM::BI__builtin_arm_mve_vdwdupq_x_n_u8:
17299 Param0 = Intrinsic::arm_mve_vdwdup_predicated;
17300 break;
17301 case ARM::BI__builtin_arm_mve_viwdupq_x_n_u8:
17302 Param0 = Intrinsic::arm_mve_viwdup_predicated;
17303 break;
17304 }
17305 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17306 Value *Val1 = UndefValue::get(Val0);
17307 Value *Val2 = EmitScalarExpr(E->getArg(0));
17308 Value *Val3 = EmitScalarExpr(E->getArg(1));
17309 Value *Val4 = EmitScalarExpr(E->getArg(2));
17310 Value *Val5 = EmitScalarExpr(E->getArg(3));
17311 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
17312 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
17313 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val1, Val2, Val3, Val4, Val7});
17314 return Builder.CreateExtractValue(Val8, static_cast<unsigned>(0));
17315 }
17316 case ARM::BI__builtin_arm_mve_vrshlq_x_s8:
17317 case ARM::BI__builtin_arm_mve_vrshlq_x_u8:
17318 case ARM::BI__builtin_arm_mve_vshlq_x_s8:
17319 case ARM::BI__builtin_arm_mve_vshlq_x_u8: {
17320 uint32_t Param0;
17321 uint32_t Param1;
17322 switch (BuiltinID) {
17323 case ARM::BI__builtin_arm_mve_vrshlq_x_s8:
17324 Param0 = 1;
17325 Param1 = 0;
17326 break;
17327 case ARM::BI__builtin_arm_mve_vrshlq_x_u8:
17328 Param0 = 1;
17329 Param1 = 1;
17330 break;
17331 case ARM::BI__builtin_arm_mve_vshlq_x_s8:
17332 Param0 = 0;
17333 Param1 = 0;
17334 break;
17335 case ARM::BI__builtin_arm_mve_vshlq_x_u8:
17336 Param0 = 0;
17337 Param1 = 1;
17338 break;
17339 }
17340 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17341 Value *Val1 = UndefValue::get(Val0);
17342 Value *Val2 = EmitScalarExpr(E->getArg(0));
17343 Value *Val3 = EmitScalarExpr(E->getArg(1));
17344 Value *Val4 = llvm::ConstantInt::get(Int32Ty, 0);
17345 Value *Val5 = llvm::ConstantInt::get(Int32Ty, Param0);
17346 Value *Val6 = llvm::ConstantInt::get(Int32Ty, Param1);
17347 Value *Val7 = EmitScalarExpr(E->getArg(2));
17348 Value *Val8 = Builder.CreateIntCast(Val7, Int32Ty, false);
17349 Value *Val9 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val8});
17350 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vshl_vector_predicated, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val4, Val5, Val6, Val9, Val1});
17351 }
17352 case ARM::BI__builtin_arm_mve_vabdq_x_s8:
17353 case ARM::BI__builtin_arm_mve_vabdq_x_u8:
17354 case ARM::BI__builtin_arm_mve_vhaddq_x_s8:
17355 case ARM::BI__builtin_arm_mve_vhaddq_x_u8:
17356 case ARM::BI__builtin_arm_mve_vhsubq_x_s8:
17357 case ARM::BI__builtin_arm_mve_vhsubq_x_u8:
17358 case ARM::BI__builtin_arm_mve_vmaxq_x_s8:
17359 case ARM::BI__builtin_arm_mve_vmaxq_x_u8:
17360 case ARM::BI__builtin_arm_mve_vminq_x_s8:
17361 case ARM::BI__builtin_arm_mve_vminq_x_u8:
17362 case ARM::BI__builtin_arm_mve_vmulhq_x_s8:
17363 case ARM::BI__builtin_arm_mve_vmulhq_x_u8:
17364 case ARM::BI__builtin_arm_mve_vrhaddq_x_s8:
17365 case ARM::BI__builtin_arm_mve_vrhaddq_x_u8:
17366 case ARM::BI__builtin_arm_mve_vrmulhq_x_s8:
17367 case ARM::BI__builtin_arm_mve_vrmulhq_x_u8:
17368 case ARM::BI__builtin_arm_mve_vrshrq_x_n_s8:
17369 case ARM::BI__builtin_arm_mve_vrshrq_x_n_u8:
17370 case ARM::BI__builtin_arm_mve_vshrq_x_n_s8:
17371 case ARM::BI__builtin_arm_mve_vshrq_x_n_u8: {
17372 uint32_t Param0;
17373 Intrinsic::ID Param1;
17374 switch (BuiltinID) {
17375 case ARM::BI__builtin_arm_mve_vabdq_x_s8:
17376 Param0 = 0;
17377 Param1 = Intrinsic::arm_mve_abd_predicated;
17378 break;
17379 case ARM::BI__builtin_arm_mve_vabdq_x_u8:
17380 Param0 = 1;
17381 Param1 = Intrinsic::arm_mve_abd_predicated;
17382 break;
17383 case ARM::BI__builtin_arm_mve_vhaddq_x_s8:
17384 Param0 = 0;
17385 Param1 = Intrinsic::arm_mve_hadd_predicated;
17386 break;
17387 case ARM::BI__builtin_arm_mve_vhaddq_x_u8:
17388 Param0 = 1;
17389 Param1 = Intrinsic::arm_mve_hadd_predicated;
17390 break;
17391 case ARM::BI__builtin_arm_mve_vhsubq_x_s8:
17392 Param0 = 0;
17393 Param1 = Intrinsic::arm_mve_hsub_predicated;
17394 break;
17395 case ARM::BI__builtin_arm_mve_vhsubq_x_u8:
17396 Param0 = 1;
17397 Param1 = Intrinsic::arm_mve_hsub_predicated;
17398 break;
17399 case ARM::BI__builtin_arm_mve_vmaxq_x_s8:
17400 Param0 = 0;
17401 Param1 = Intrinsic::arm_mve_max_predicated;
17402 break;
17403 case ARM::BI__builtin_arm_mve_vmaxq_x_u8:
17404 Param0 = 1;
17405 Param1 = Intrinsic::arm_mve_max_predicated;
17406 break;
17407 case ARM::BI__builtin_arm_mve_vminq_x_s8:
17408 Param0 = 0;
17409 Param1 = Intrinsic::arm_mve_min_predicated;
17410 break;
17411 case ARM::BI__builtin_arm_mve_vminq_x_u8:
17412 Param0 = 1;
17413 Param1 = Intrinsic::arm_mve_min_predicated;
17414 break;
17415 case ARM::BI__builtin_arm_mve_vmulhq_x_s8:
17416 Param0 = 0;
17417 Param1 = Intrinsic::arm_mve_mulh_predicated;
17418 break;
17419 case ARM::BI__builtin_arm_mve_vmulhq_x_u8:
17420 Param0 = 1;
17421 Param1 = Intrinsic::arm_mve_mulh_predicated;
17422 break;
17423 case ARM::BI__builtin_arm_mve_vrhaddq_x_s8:
17424 Param0 = 0;
17425 Param1 = Intrinsic::arm_mve_rhadd_predicated;
17426 break;
17427 case ARM::BI__builtin_arm_mve_vrhaddq_x_u8:
17428 Param0 = 1;
17429 Param1 = Intrinsic::arm_mve_rhadd_predicated;
17430 break;
17431 case ARM::BI__builtin_arm_mve_vrmulhq_x_s8:
17432 Param0 = 0;
17433 Param1 = Intrinsic::arm_mve_rmulh_predicated;
17434 break;
17435 case ARM::BI__builtin_arm_mve_vrmulhq_x_u8:
17436 Param0 = 1;
17437 Param1 = Intrinsic::arm_mve_rmulh_predicated;
17438 break;
17439 case ARM::BI__builtin_arm_mve_vrshrq_x_n_s8:
17440 Param0 = 0;
17441 Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
17442 break;
17443 case ARM::BI__builtin_arm_mve_vrshrq_x_n_u8:
17444 Param0 = 1;
17445 Param1 = Intrinsic::arm_mve_vrshr_imm_predicated;
17446 break;
17447 case ARM::BI__builtin_arm_mve_vshrq_x_n_s8:
17448 Param0 = 0;
17449 Param1 = Intrinsic::arm_mve_shr_imm_predicated;
17450 break;
17451 case ARM::BI__builtin_arm_mve_vshrq_x_n_u8:
17452 Param0 = 1;
17453 Param1 = Intrinsic::arm_mve_shr_imm_predicated;
17454 break;
17455 }
17456 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17457 Value *Val1 = UndefValue::get(Val0);
17458 Value *Val2 = EmitScalarExpr(E->getArg(0));
17459 Value *Val3 = EmitScalarExpr(E->getArg(1));
17460 Value *Val4 = llvm::ConstantInt::get(Int32Ty, Param0);
17461 Value *Val5 = EmitScalarExpr(E->getArg(2));
17462 Value *Val6 = Builder.CreateIntCast(Val5, Int32Ty, false);
17463 Value *Val7 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val6});
17464 return Builder.CreateCall(CGM.getIntrinsic(Param1, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val4, Val7, Val1});
17465 }
17466 case ARM::BI__builtin_arm_mve_vrev16q_x_s8:
17467 case ARM::BI__builtin_arm_mve_vrev16q_x_u8:
17468 case ARM::BI__builtin_arm_mve_vrev32q_x_s8:
17469 case ARM::BI__builtin_arm_mve_vrev32q_x_u8:
17470 case ARM::BI__builtin_arm_mve_vrev64q_x_s8:
17471 case ARM::BI__builtin_arm_mve_vrev64q_x_u8: {
17472 uint32_t Param0;
17473 switch (BuiltinID) {
17474 case ARM::BI__builtin_arm_mve_vrev16q_x_s8:
17475 Param0 = 16;
17476 break;
17477 case ARM::BI__builtin_arm_mve_vrev16q_x_u8:
17478 Param0 = 16;
17479 break;
17480 case ARM::BI__builtin_arm_mve_vrev32q_x_s8:
17481 Param0 = 32;
17482 break;
17483 case ARM::BI__builtin_arm_mve_vrev32q_x_u8:
17484 Param0 = 32;
17485 break;
17486 case ARM::BI__builtin_arm_mve_vrev64q_x_s8:
17487 Param0 = 64;
17488 break;
17489 case ARM::BI__builtin_arm_mve_vrev64q_x_u8:
17490 Param0 = 64;
17491 break;
17492 }
17493 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17494 Value *Val1 = UndefValue::get(Val0);
17495 Value *Val2 = EmitScalarExpr(E->getArg(0));
17496 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param0);
17497 Value *Val4 = EmitScalarExpr(E->getArg(1));
17498 Value *Val5 = Builder.CreateIntCast(Val4, Int32Ty, false);
17499 Value *Val6 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val5});
17500 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vrev_predicated, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val6, Val1});
17501 }
17502 case ARM::BI__builtin_arm_mve_vandq_x_s8:
17503 case ARM::BI__builtin_arm_mve_vandq_x_u8:
17504 case ARM::BI__builtin_arm_mve_vbicq_x_s8:
17505 case ARM::BI__builtin_arm_mve_vbicq_x_u8:
17506 case ARM::BI__builtin_arm_mve_veorq_x_s8:
17507 case ARM::BI__builtin_arm_mve_veorq_x_u8:
17508 case ARM::BI__builtin_arm_mve_vornq_x_s8:
17509 case ARM::BI__builtin_arm_mve_vornq_x_u8:
17510 case ARM::BI__builtin_arm_mve_vorrq_x_s8:
17511 case ARM::BI__builtin_arm_mve_vorrq_x_u8: {
17512 Intrinsic::ID Param0;
17513 switch (BuiltinID) {
17514 case ARM::BI__builtin_arm_mve_vandq_x_s8:
17515 Param0 = Intrinsic::arm_mve_and_predicated;
17516 break;
17517 case ARM::BI__builtin_arm_mve_vandq_x_u8:
17518 Param0 = Intrinsic::arm_mve_and_predicated;
17519 break;
17520 case ARM::BI__builtin_arm_mve_vbicq_x_s8:
17521 Param0 = Intrinsic::arm_mve_bic_predicated;
17522 break;
17523 case ARM::BI__builtin_arm_mve_vbicq_x_u8:
17524 Param0 = Intrinsic::arm_mve_bic_predicated;
17525 break;
17526 case ARM::BI__builtin_arm_mve_veorq_x_s8:
17527 Param0 = Intrinsic::arm_mve_eor_predicated;
17528 break;
17529 case ARM::BI__builtin_arm_mve_veorq_x_u8:
17530 Param0 = Intrinsic::arm_mve_eor_predicated;
17531 break;
17532 case ARM::BI__builtin_arm_mve_vornq_x_s8:
17533 Param0 = Intrinsic::arm_mve_orn_predicated;
17534 break;
17535 case ARM::BI__builtin_arm_mve_vornq_x_u8:
17536 Param0 = Intrinsic::arm_mve_orn_predicated;
17537 break;
17538 case ARM::BI__builtin_arm_mve_vorrq_x_s8:
17539 Param0 = Intrinsic::arm_mve_orr_predicated;
17540 break;
17541 case ARM::BI__builtin_arm_mve_vorrq_x_u8:
17542 Param0 = Intrinsic::arm_mve_orr_predicated;
17543 break;
17544 }
17545 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17546 Value *Val1 = UndefValue::get(Val0);
17547 Value *Val2 = EmitScalarExpr(E->getArg(0));
17548 llvm::Type *Val3 = llvm::FixedVectorType::get(Int8Ty, 16);
17549 Value *Val4 = Builder.CreateBitCast(Val2, Val3);
17550 Value *Val5 = EmitScalarExpr(E->getArg(1));
17551 llvm::Type *Val6 = llvm::FixedVectorType::get(Int8Ty, 16);
17552 Value *Val7 = Builder.CreateBitCast(Val5, Val6);
17553 Value *Val8 = EmitScalarExpr(E->getArg(2));
17554 Value *Val9 = Builder.CreateIntCast(Val8, Int32Ty, false);
17555 Value *Val10 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val9});
17556 llvm::Type *Val11 = llvm::FixedVectorType::get(Int8Ty, 16);
17557 Value *Val12 = Builder.CreateBitCast(Val1, Val11);
17558 Value *Val13 = Builder.CreateCall(CGM.getIntrinsic(Param0, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val4, Val7, Val10, Val12});
17559 llvm::Type *Val14 = llvm::FixedVectorType::get(Int8Ty, 16);
17560 return Builder.CreateBitCast(Val13, Val14);
17561 }
17562 case ARM::BI__builtin_arm_mve_vdupq_x_n_s8:
17563 case ARM::BI__builtin_arm_mve_vdupq_x_n_u8: {
17564 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17565 Value *Val1 = UndefValue::get(Val0);
17566 Value *Val2 = EmitScalarExpr(E->getArg(1));
17567 Value *Val3 = Builder.CreateIntCast(Val2, Int32Ty, false);
17568 Value *Val4 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val3});
17569 Value *Val5 = EmitScalarExpr(E->getArg(0));
17570 Value *Val6 = ARMMVEVectorSplat(Builder, Val5);
17571 return Builder.CreateSelect(Val4, Val6, Val1);
17572 }
17573 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s8:
17574 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u8:
17575 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s8:
17576 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u8:
17577 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s8:
17578 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s8: {
17579 uint32_t Param0;
17580 uint32_t Param1;
17581 switch (BuiltinID) {
17582 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_s8:
17583 Param0 = 1;
17584 Param1 = 1;
17585 break;
17586 case ARM::BI__builtin_arm_mve_vcaddq_rot270_x_u8:
17587 Param0 = 1;
17588 Param1 = 1;
17589 break;
17590 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_s8:
17591 Param0 = 1;
17592 Param1 = 0;
17593 break;
17594 case ARM::BI__builtin_arm_mve_vcaddq_rot90_x_u8:
17595 Param0 = 1;
17596 Param1 = 0;
17597 break;
17598 case ARM::BI__builtin_arm_mve_vhcaddq_rot270_x_s8:
17599 Param0 = 0;
17600 Param1 = 1;
17601 break;
17602 case ARM::BI__builtin_arm_mve_vhcaddq_rot90_x_s8:
17603 Param0 = 0;
17604 Param1 = 0;
17605 break;
17606 }
17607 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17608 Value *Val1 = UndefValue::get(Val0);
17609 Value *Val2 = llvm::ConstantInt::get(Int32Ty, Param0);
17610 Value *Val3 = llvm::ConstantInt::get(Int32Ty, Param1);
17611 Value *Val4 = EmitScalarExpr(E->getArg(0));
17612 Value *Val5 = EmitScalarExpr(E->getArg(1));
17613 Value *Val6 = EmitScalarExpr(E->getArg(2));
17614 Value *Val7 = Builder.CreateIntCast(Val6, Int32Ty, false);
17615 Value *Val8 = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_pred_i2v, {llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val7});
17616 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_mve_vcaddq_predicated, {llvm::FixedVectorType::get(Int8Ty, 16), llvm::FixedVectorType::get(Builder.getInt1Ty(), 16)}), {Val2, Val3, Val1, Val4, Val5, Val8});
17617 }
17618 case ARM::BI__builtin_arm_mve_vnegq_s8: {
17619 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17620 Value *Val1 = llvm::Constant::getNullValue(Val0);
17621 Value *Val2 = EmitScalarExpr(E->getArg(0));
17622 return Builder.CreateSub(Val1, Val2);
17623 }
17624 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_s8:
17625 case ARM::BI__builtin_arm_mve_vuninitializedq_polymorphic_u8:
17626 case ARM::BI__builtin_arm_mve_vuninitializedq_s8:
17627 case ARM::BI__builtin_arm_mve_vuninitializedq_u8: {
17628 llvm::Type *Val0 = llvm::FixedVectorType::get(Int8Ty, 16);
17629 return UndefValue::get(Val0);
17630 }